当前位置:   article > 正文

C++ vector容器的多种遍历方式_c++ vector 遍历

c++ vector 遍历

vector容器的遍历方式

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <iterator>
  5. using namespace std;
  6. template<typename Type> //类型模板
  7. Type v_print(const Type val)
  8. {
  9. cout<<val<<" "; //有了模板val可以使用多种类型
  10. return val;
  11. }
  12. int v_assign(int &i)
  13. {
  14. i=rand()%10; //头文件<cstdlib>
  15. return i;
  16. }
  17. int main(void)
  18. {
  19. int a[]={10,11,12,3,4,5,6,7,8,9};
  20. int len=sizeof(a)/sizeof(a[0]);
  21. //方式一:普通for循环,下标法
  22. cout<<"一、普通for循环:"<<endl;
  23. vector <int> v1;
  24. v1.reserve(len); //预留空间后才能用下标法赋值,否则崩溃
  25. for (int i=0;i<len;i++) v1[i]=a[i];
  26. cout<<"当前vector的大小:"<<v1.size()<<endl; //虽然成功赋值但size()依旧为0
  27. for (int i=0;i<len;i++) cout<<v1[i]<<" "; cout<<endl;
  28. v1.resize(len); //resize可行但仅为测试。不如直接声明 v1(10);
  29. for (int i=0;i<len;i++) v1[i]=a[i];
  30. cout<<"当前vector的大小:"<<v1.size()<<endl;
  31. for (int i=0;i<len;i++) cout<<v1.at(i)<<" "; cout<<endl<<endl;
  32. //方式二:for auto循环,C++11新语句
  33. cout<<"二、for auto循环:"<<endl;
  34. vector <int> v2;
  35. for (auto arr:a) v2.push_back(arr);
  36. for (auto vec:v2) cout<<vec<<" "; cout<<endl<<endl;
  37. /*显而易见,for auto比方式一更简洁 */
  38. for (auto &v:v2) cout<<(++v)++<<" "; cout<<endl;
  39. for (auto vec:v2) cout<<vec<<" "; cout<<endl<<endl;
  40. //for (auto &v:vector) 用&v还能在循环中改变vector元素的值
  41. //方式三:迭代器
  42. //迭代器 iterator 是一种用于遍历容器元素的数据类型
  43. //vector<T>::iterator iter;//定义一个T类型vector的迭代器
  44. //除了这种普通迭代器,还有插入迭代器、流迭代器、反向迭代器和移动迭代器
  45. //操作符 *iter 访问迭代器所指向的元素的值,与指针类似
  46. //只读迭代器声明时用: vector<T>::const_iterator const_iter;
  47. cout<<"三、迭代器方式:"<<endl;
  48. vector <int> v3(10);
  49. for(vector<int>::size_type ix=0;ix!=v3.size();ix++) v3[ix]=rand()%10;
  50. //vector<int>::size_type 等价于unsigned int
  51. cout<<"for语句:"<<endl;
  52. vector<int>::iterator it=v3.begin();
  53. for(;it!=v3.end();it++) cout<<*it<<" "; cout<<endl;
  54. //或者写成一行: for(vector<int>::iterator it=v3.begin();it!=v3.end();it++)...
  55. //或用auto关键字更容易理解: for(auto it=v3.begin();it!=v3.end();it++)...
  56. cout<<"while语句:"<<endl;
  57. it=v3.begin(); //迭代器指回到起始位置
  58. while (it!=v3.end()) cout<<*(it++)<<" "; cout<<endl; //一定要it++,不能++it
  59. cout<<"for auto语句:"<<endl;
  60. for (auto it=v3.begin();it!=v3.end();it++) cout<<*it<<" "; cout<<endl<<endl;
  61. //方式四:for_each() 必须头文件<algorithm>
  62. cout<<"四、for_each()方式:"<<endl;
  63. vector <int> v4(10);
  64. cout<<"调用库函数或自定义函数:"<<endl;
  65. for_each(v4.begin(), v4.end(), v_assign); //调用自定义函数v_assign()随机赋个一位整数
  66. for_each(v4.begin(), v4.end(), v_print<int>); //调用自定义函数v_print()列印元素
  67. cout<<endl;
  68. cout<<"直接使用Lambda匿名函数:"<<endl;
  69. for_each(v4.begin(), v4.end(), [](const int& val)->void{cout<<val<<" ";});
  70. cout<<endl<<endl; //关于Lambda函数另找时间讨论学习
  71. //方式五:transform() 必须头文件<algorithm>
  72. cout<<"五、transform()方式:"<<endl;
  73. vector <int> v5(10);
  74. transform(v5.begin(),v5.end(),v5.begin(),v_assign);
  75. transform(v5.begin(),v5.end(),v5.begin(),v_print<int>); cout<<endl;
  76. transform(v5.begin(),v5.end(),v5.begin(),[](const int& val)->int{cout<<val<<" ";});
  77. cout<<endl<<endl;
  78. //方式六:copy()+迭代器
  79. cout<<"六、copy()+迭代器:"<<endl;
  80. vector<int> tmp(3); //创建3个元素的临时容器,默认值{000}
  81. copy(v4.begin(),v4.end(),back_inserter(tmp)); //插入迭代器 back_inserter (尾部追加)
  82. for_each(tmp.begin(), tmp.end(), v_print<int>); cout<<endl;
  83. copy(v4.begin()+1,v4.begin()+5, inserter(tmp,tmp.begin()+1)); //插入迭代器 inserter
  84. for_each(tmp.begin(), tmp.end(), v_print<int>); cout<<endl<<endl;
  85. vector <string> v6(10,"a");
  86. ostream_iterator<string> output(cout," "); //流迭代器 ostream_iterator
  87. copy(v6.begin(),v6.end(),output); cout<<endl<<endl;
  88. //或者写成一行:copy(v6.begin(), v6.end(), ostream_iterator<string>(cout, " "));
  89. //最后测试一下用 v_print()输出string
  90. for_each(v6.begin(), v6.end(), v_print<string>); cout<<endl;
  91. transform(v6.begin(), v6.end(), v6.begin(), v_print<string>);
  92. return 0;
  93. }

输出结果:

  1. 一、普通for循环:
  2. 当前vector的大小:0
  3. 10 11 12 3 4 5 6 7 8 9
  4. 当前vector的大小:10
  5. 10 11 12 3 4 5 6 7 8 9
  6. 二、for auto循环:
  7. 10 11 12 3 4 5 6 7 8 9
  8. 11 12 13 4 5 6 7 8 9 10
  9. 12 13 14 5 6 7 8 9 10 11
  10. 三、迭代器方式:
  11. for语句:
  12. 1 7 4 0 9 4 8 8 2 4
  13. while语句:
  14. 1 7 4 0 9 4 8 8 2 4
  15. for auto语句:
  16. 1 7 4 0 9 4 8 8 2 4
  17. 四、for_each()方式:
  18. 调用库函数或自定义函数:
  19. 5 5 1 7 1 1 5 2 7 6
  20. 直接使用Lambda匿名函数:
  21. 5 5 1 7 1 1 5 2 7 6
  22. 五、transform()方式:
  23. 1 4 2 3 2 2 1 6 8 5
  24. 1 4 2 3 2 2 1 6 8 5
  25. 六、copy()+迭代器:
  26. 0 0 0 5 5 1 7 1 1 5 2 7 6
  27. 0 5 1 7 1 0 0 5 5 1 7 1 1 5 2 7 6
  28. a a a a a a a a a a
  29. a a a a a a a a a a
  30. a a a a a a a a a a
  31. --------------------------------
  32. Process exited after 0.4503 seconds with return value 0
  33. 请按任意键继续. . .

vector[i]和vector.at(i)区别

后者比前者多了对i是否越界的检查,如i>=size()会抛出std::out_of_range异常,建议使用后者。

for_each()和transform()的区别

1.前者靠形参&引用方式传递可以是void型函数,后者必须有return来返回值;
2.后者还有5个参数的形式,比如可以将两个源容器a和b的元素相加,并将结果追加到目标容器c尾部。
       如:transform(a.begin(), a.end(), b.begin(), back_inserter(c), aplusb<int>());  //back_inserter 是插入迭代器之一

  1. #include <iostream>
  2. #include <vector>
  3. #include <iterator>
  4. #include <algorithm>
  5. using namespace std;
  6. template <class Type>Type apb (Type a, Type b)
  7. {
  8. return (a+b);
  9. }
  10. int main(void)
  11. {
  12. vector<int> a(4),b={1,2,3,4,5,6,7};
  13. for (auto v:b) cout<<v<<" "; cout<<endl;
  14. copy(b.begin(), b.end(), inserter(a,a.begin()+4));
  15. for (auto v:a) cout<<v<<" "; cout<<endl;
  16. vector<int> tmp;
  17. transform(b.begin(), b.end(), a.begin(), back_inserter(tmp), apb<int>);
  18. for (auto v:tmp) cout<<v<<" "; cout<<endl;
  19. }
  20. /*
  21. 运行结果:
  22. 1 2 3 4 5 6 7
  23. 0 0 0 1 2 3 4 5 6 7 0
  24. 1 2 3 5 7 9 11
  25. --------------------------------
  26. Process exited after 0.614 seconds with return value 0
  27. 请按任意键继续. . .
  28. */

 

vector 相关文章:

C++ vector声明和赋值的相关函数

C++ vector容器的多种遍历方式

C++ vector 删除和排序的相关函数

C++ vector 赋值、删除、排序类之外的其他函数

C++ vector 容器的全排列算法 next_permutation

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/488401
推荐阅读
  

闽ICP备14008679号