• C++之动态数组(Vector)中运用各类迭代器


    迭代器按照定义分类:

    正向迭代器:    容器类名::iterator  迭代器名;        依次向下遍历
    反向迭代器:    容器类名::reverse_iterator  迭代器名;    依次向上遍历
    常量正向迭代器:    容器类名::const_iterator  迭代器名;
    常量反向迭代器:    容器类名::const_reverse_iterator  迭代器名;

    -------------------------------------------------------------------------------------------------------------------------

    迭代器按照功能分类:

    正向迭代器,支持相互赋值、比较、自加、取内容等

    双向迭代器,具有正向迭代器全部功能,支持自减

    随机访问寄存器,具有双向迭代器的全部功能

    不同容器的迭代器的功能: 

    随机访问寄存器                        vector、deque

    双向寄存器                                list、set /multiset、map /multimap

    不支持迭代器寄存器                 stack、queue、priority_queue

    C++迭代器(STL迭代器)iterator详解 (biancheng.net)

    1. v.end():
    2. 指向向量最后一个元素之后的元素,一般用于正向迭代器
    3. v.rend():
    4. 指向向量第一个元素之前的元素,一般用于反向迭代器
    5. v.begin():
    6. 返回一个指向向量第一个元素的迭代器,用于正向输出动态数组中的元素
    7. v.rbegin():
    8. 返回一个指向向量最后一个元素的反向迭代器,用于逆向输出动态数组中的元素
    9. v.front():
    10. 引用容器的第一个元素
    11. v.assign(first,last):
    12. 新值替换旧值,定义了范围,first与last之间被替代
    13. v.assign(n,val):
    14. 给指定容器v分配了n次val值,从容器头开始替代
    15. v.erase(pos):
    16. 删除迭代器指向pos位置的指定元素
    17. v.erase(first,last):
    18. 删除容器first与last之间的内容
    19. v.emplace(pos,val):
    20. 在容器的pos位置处插入一个新元素val
    21. v.capacity():
    22. 返回容器大小
    23. v1.crbegin():
    24. rbegin(),只是适用于常量迭代器,不能被修改
    25. v1.crend()、v1.cend()、v1.cbegin()类似
    26. v.clear():
    27. 清空容器
    28. v.hypot():
    29. 返回两个数的平方和的平方根
    30. v.push_back(val):
    31. 在容器末尾插入val
    32. v.pop_back():
    33. 删除容器末尾的元素
    34. v.insert(pos,val):
    35. 在pos处插入元素val
    36. v.insert(pos,n,val):
    37. 在pos处连续插入n次元素val
    38. v.insert(pos,first,last):
    39. 在pos处连续插入first-last之间的内容,可用于容器拼接
    40. v.swap(v1):
    41. 交换容器 v 和 v1 里面的内容
    42. v.resize(n):
    43. 重置容器大小,一般是用于缩小容器容量
    44. v.resize(n,val):
    45. 重置容器大小,一般用于扩大容器容量,并将无元素的位置插入val值
    46. v.data():
    47. 返回一个指向向量内部用于存储其元素的数组的指针
    其余方法和list很多相似,详见请看: C++之链表list的方法总结_承诺$枷锁的博客-CSDN博客

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main()
    6. {
    7. //定义动态数组
    8. vector v{"hello","vector","string"}; //vector v(100);
    9. //定义正向迭代器
    10. vector::iterator it;
    11. //定义反向迭代器
    12. vector::reverse_iterator rit;
    13. for(it=v.begin();it!=v.end();++it){
    14. cout<<*it<<" "; //结果:hello vector string
    15. }
    16. cout<
    17. for(rit=v.rbegin();rit!=v.rend();++rit){
    18. cout<<*rit<<" "; //string vector hello
    19. }
    20. cout<
    21. string str ("this string erase.");
    22. str.erase(4,7); //删除字符串str中从下标为4开始连续删除7个
    23. cout<//this erase.
    24. //删除动态数组中首元素,并打印删除后迭代器的指向
    25. cout<<*(v.erase(v.begin()))<//vector,这里无循环,所以只打印现有的首地址元素
    26. //删除字符串里面下文两者之间的内容
    27. str.erase(str.begin()+5,str.end()-6);
    28. cout<//this erase.
    29. //引用容器第一个元素
    30. cout<front()<//vector
    31. //引用容器最后一个元素
    32. cout<back()<//string
    33. vector v1;
    34. cout<<"================="<
    35. //将容器 v 中的数据全部赋给容器 v1
    36. v1.assign(v.begin(),v.end());
    37. for(int i=0;isize();i++)
    38. cout<" "; //vector string
    39. cout<
    40. cout<<"================="<
    41. //将容器 v1中的数据从头开始的 n 个元素被替代成 c
    42. v1.assign(1,"c");
    43. for(int i=0;isize();i++)
    44. cout<" "; //c string
    45. cout<
    46. cout<<"================="<
    47. for(int i=0;isize();i++)
    48. cout<" "; //容器v的元素:vector string
    49. cout<
    50. //在容器 v的首位置处插入 hello
    51. v.emplace(v.begin(),"hello");
    52. for(int i=0;isize();i++)
    53. cout<" "; //容器v的元素:hello vector string
    54. cout<
    55. //返回容器的容量
    56. cout<<"容器v的容量为:"<capacity()<//3
    57. cout<<"================="<
    58. vector<int> cv{1,2,3};
    59. //同rbegin(),只是适用于常量迭代器,不能被修改
    60. //v1.crend()、v1.cend()、v1.cbegin()类似
    61. vector<int>::const_reverse_iterator crit=cv.crbegin(); //常量反向迭代器
    62. // *crit=5;//assignment of read-only location
    63. cout<<*crit<//不能被修改,所以报错
    64. //清除容器cv内的内容
    65. cv.clear(); //清除常量cv内的内容
    66. cout<<"-------------------"<
    67. for(int i=0;isize();i++)
    68. cout<//所以这里东西没有显示
    69. cout<<"================="<
    70. int i=2,j=3,z=4;
    71. cout<<"2,3的平方和的平方跟:"<<hypot(i,j)<//cmath头文件
    72. cout<<"================="<
    73. for(int i=0;isize();i++)
    74. cout<" "; //打印容器v中的所有元素:hello vector string
    75. cout<
    76. //元素 push_back 进栈
    77. v.push_back("push_back");
    78. for(int i=0;isize();i++)
    79. cout<" "; //打印容器v中的所有元素:hello vector string push_back
    80. cout<
    81. //出栈
    82. v.pop_back();
    83. for(int i=0;isize();i++)
    84. cout<" "; //打印容器v中的所有元素:hello vector string
    85. cout<
    86. //在容器末尾插入 insert
    87. v.insert(v.end(),"insert");
    88. //在容器头连续插入两次 two
    89. v.insert(v.begin(),2,"two");
    90. for(int i=0;isize();++i)
    91. cout<" "; //打印容器v中的所有元素:two two hello vector string insert
    92. cout<
    93. for(int i=0;isize();++i)
    94. cout<<"容器v1:"<" "; //打印容器v1中的所有元素: 容器v1:c
    95. cout<
    96. //将容器 v1 里面的内容追加到容器 v 中
    97. v.insert(v.end(),v1.begin(),v1.end());
    98. for(int i=0;isize();i++)
    99. cout<" "; //打印容器v中的所有元素:two two hello vector string insert c
    100. cout<
    101. //交换两个容器里面的内容
    102. v.swap(v1);
    103. cout<<"容器v:";
    104. for(int i=0;isize();++i)
    105. cout<" "; //交换容器内容后打印容器 v 的内容: 容器v:c
    106. cout<
    107. cout<<"容器v1:";
    108. for(int i=0;isize();++i)
    109. cout<" "; //容器v1:two two hello vector string insert c
    110. cout<
    111. //缩小容器 v1 的容量
    112. v1.resize(6);
    113. cout<<"容器v1:";
    114. for(int i=0;isize();++i)
    115. cout<" "; //容器v1:two two hello vector string insert
    116. cout<
    117. //扩大容器 v 的容量,并填充 hello
    118. v.resize(3,"hello");
    119. cout<<"容器v:";
    120. for(int i=0;isize();++i)
    121. cout<" "; //容器v:c hello hello
    122. cout<
    123. //返回一个指向容器 v 内部用于存储其元素的数组的指针
    124. string *p = v.data();
    125. for(int i=0;isize();++i)
    126. cout<<*p++<<" "; //c hello hello
    127. cout<
    128. }

    v.erase():删除迭代器指向的指定元素
    erase函数的原型如下:
    1)string& erase(size_t pos = 0, size_t n = npos);
    erase(pos,n);        删除从pos开始的n个字符
    2)iterator erase(iterator position);
    erase(position);    删除position处的一个元素
    3)iterator erase(iterator first, iterator last);
    erase(first,last);    删除从first到last之间的字符(first和last都是迭代器)

    1. string str ("this string erase.");
    2. str.erase(4,7);
    3. cout<
    4. //删除动态数组中首元素,并打印删除后迭代器的指向
    5. cout<<*(v.erase(v.begin()))<
    6. //删除字符串里面下文两者之间的内容
    7. str.erase(str.begin()+5,str.end()-6);
    8. cout<
    1. this erase.
    2. vector
    3. this erase.

    v.assign():为向量分配新值并替换旧值

    assign函数原型如下:
    assign(Iterator first,Iterator last);给容器定义了范围,first与last之间被替代,可用于容器给容器赋值
    举例:v.assign(first,last);  

    assign(size_type n,const value_type& val);  从容器v头部开始,替代n次val值
    举例:v.assign(n,val);//次数,分配值    

    1. vector v1;
    2. cout<<"================="<
    3. //将容器 v 中的数据全部赋给容器 v1
    4. v1.assign(v.begin(),v.end());
    5. for(int i=0;isize();i++)
    6. cout<
    7. cout<<"================="<
    8. //将容器 v1中的数据从头开始的 n 个元素被替代成 c
    9. v1.assign(1,"c");
    10. for(int i=0;isize();i++)
    11. cout<
    1. =================
    2. vector
    3. string
    4. =================
    5. c
    6. string
  • 相关阅读:
    JavaScript对象:我们真的需要模拟类吗?
    IIC基本知识
    苏州科技大学计算机考研资料汇总
    多目标果蝇算法及其MATLAB实现
    力扣每日一题60:排序序列
    conda安装Tensorflow2.9的GPU版本
    ai智能电话机器人如何撑起一个部门
    如何设计对外接口
    由浅入深,从掌握Promise的基本使用到手写Promise
    在阿里做前端程序员,我是这样规划的
  • 原文地址:https://blog.csdn.net/hold_the_key/article/details/126799998