有关C++ STL 中的vector向量的用法(代码示例)

一、 简介

Vector是一个称为向量的顺序容器(不明白顺序容器与关联容器的可以Google)。

二、 特点

1. 动态(相当于一个动态数组);
2. 可用于存放各种数据结构(内置的,自定义的,当然也可以是vector)(当是vector时注意申明格式eg:vector<vector<Information>>与vector< vector<Information> >,前者错误,后者正确,两个‘>’要有空格);
3. 支持对vector元素的随即访问;
4. 以拷贝的方式用一个vector初始化另一个vector时,两个vector类型要一致;
5. 每一个vector的容量要比其大小相对较大或相等(eg:vec.capacity()>=vec.size())。

三、 常用函数接口

  1. Vec.begin();//向量中的首个元素的地址,加n后表示第n个元素的地址(eg:vec.begin()+3);
  2. Vec.end();//向量中最后一个元素的地址;
  3. Vec.rbegin();//指向反序后的向量首元素;
  4. Vec.rend();//指向反序后的尾元素;
  5. vec.front();//返回vector中的第一元素的值
  6. vec.back();//返回vector中的最后一个元素的值
  7. Vec.insert();//向向量中任意位置插入一个或多个元素;
  8. Vec.clear();//向量清空;
  9. Vec.push_back();//将元素压入向量的尾部;
  10. //Vec.push_front();//vector中无此用法(用了之后会造成元素的迁移,与vector设计的初衷相违背);
  11. Vec.erase();//删除向量中任意一个或一段元素;
  12. Vec.pop_back();//删除向量中最后一个元素;
  13. Vec.size();//返回向量的大小
  14. Vec.capacity();//返回向量容量的大小
  15. Vec.empty();//向量为空返回false,不为空返回true;
  16. Vec1.swap(vec2);//交换向量vec1和向量vec2;

四、 代码示例

  1.    示例一://vector元素为简单的元素,进行简单地操作
  1. #include<iostream>
  2. #include<iomanip>
  3. #include<vector>
  4. #include<string>
  5. using namespace std;
  6. template <typename T>//一个函数末班,用向量表示函数
  7. void display(vector<T>&vec)
  8. {
  9. static int n=1;//设置一个静态变量,用来标记每次输出
  10. cout<<n++<<'.'<<endl;
  11. cout<<"the size of the vec is "<<vec.size()<<endl;
  12. cout<<"the capacity of the vec is"<<vec.capacity()<<endl;
  13. if(!vec.empty())
  14. {
  15. cout<<"the contents are:"<<endl;
  16. for(int i=0;i<vec.size();i++)
  17. {
  18. cout<<setw(10)<<vec[i];
  19. }
  20. cout<<endl<<endl;
  21. }
  22. else
  23. cout<<"this is a empty vector"<<endl<<endl;
  24. }
  25. const int size=5;
  26. int main()
  27. {
  28. string str[size]={"love","you","my","c++","language"};
  29. vector<string>vec1;
  30.  
  31. vec1.insert(vec1.begin(),str,str+size);//从vec1.begin()(此时等于vec1.end())处插入所有str当中的字符
  32. display(vec1);
  33. cout<<vec1.front()<<endl;//返回第一个元素的值
  34. cout<<vec1.front()+" VB.NET"<<endl;
  35. cout<<vec1.back()<<endl;//返回最后一个元素的值
  36. cout<<vec1.back()+" VB.NET"<<endl;
  37. cout<<*(vec1.begin()+1)<<endl;//用cout流对象输出vecotor的元素
  38. cout<<*(vec1.rbegin()+1)+" c#"<<endl;
  39. cout<<vec1[1]<<endl<<endl;//用下标法输出vecotor元素
  40. vec1.clear();//清空向量vec1
  41. display(vec1);
  42. vec1.insert(vec1.begin(),str+2,str+size-1);//可以插入任意个元素(此处为2个)
  43. display(vec1);
  44. vec1.insert(vec1.begin()+1,3,"java");//从vec1.begin()+1处插入3个“Java”字符串
  45. display(vec1);
  46. vec1.insert(vec1.begin()+3,3,str[2]);//从vec1.begin()+3处插入3个str[2]字符串
  47. display(vec1);
  48. vector <string>vec2(vec1);//调用拷贝构造函数,以vec1初始化vec2
  49. display(vec2);
  50. vec2.clear();
  51. vec2.insert(vec2.end(),vec1.begin(),vec1.end());
  52. display(vec2);
  53. vec2.erase(vec2.begin()+3,vec2.begin()+6);//删除vec2.begin()+3到vec2.begin()+6之间的字符串
  54. display(vec2);
  55. for(int i=0;i<5;i++)
  56. {
  57. vec2.pop_back();//删除最后一个字符串
  58. display(vec2);
  59. }
  60. return 0;
  61. }

  

  1.   示例二:vector元素为struct
  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. #include<iomanip>
  5. using namespace std;
  6. const int n=6;
  7. struct Information
  8. {
  9. string studentName;
  10. string studentSex;
  11. double studentRank;
  12. friend ostream &operator<<(ostream& out,Information &p);
  13. friend istream &operator>>(istream& in,vector<Information>&p);
  14. };
  15. istream &operator>>(istream& in,vector<Information>&p)//重载输入用算符,不是此blog重点,在主函数中未使用
  16. {
  17. for(int i=0;i<n;i++)
  18. in>>p[i].studentName>>p[i].studentSex>>p[i].studentRank;
  19. return in;
  20. }
  21. ostream &operator<<(ostream& out,vector<Information>&p)//重载输出用算符,可以看到有与display()函数同样的效果
  22. {
  23. for(int i=0;i<n;i++)
  24. out<<"name: "<<setw(10)<<p[i].studentName<<" sex: "<<setw(2)<<p[i].studentSex<<" rank: "<<setw(5)<<p[i].studentRank<<endl;
  25. return out;
  26. }
  27. void display(vector<Information>&Student)//显示排名情况
  28. {
  29. if(!(Student.empty()))
  30. {
  31. for(int i=0;i<Student.size();i++)
  32. {
  33. cout<<"name: "<<setw(10)<<Student[i].studentName<<" sex: "<<setw(5)<<Student[i].studentSex<<" rank: "<<setw(5)<<Student[i].studentRank<<endl;
  34. }
  35. }
  36. else
  37. cout<<"this is a empty vector"<<endl;
  38. }
  39. int main()
  40. {
  41. string name[n]={"ZhangSan","liSi","WangMaZi","XiaoMing","XiaoHua","XiaoZhang"};
  42. vector<string>Name;
  43. vector<string>Sex(n,"\0");
  44. vector<int>Rank(n,0);//初始化一个大小为n,元素都为零的向量
  45. Name.insert(Name.begin(),name,name+n);
  46. for(int i=0;i<n;i++)
  47. {
  48. cout<<"Please input "<<Name[i]<<"'s sex: ";
  49. cin>>Sex[i];
  50. cout<<"Please input "<<Name[i]<<"'s rank(0~100): ";
  51. cin>>Rank[i];//用流对象cin向向量赋值
  52. }
  53. vector<Information>Student1;
  54. //cin>>Student;
  55. for(int i=0;i<n;i++)
  56. {
  57. Information temp;
  58. temp.studentName=Name[i];
  59. temp.studentSex=Sex[i];
  60. temp.studentRank=Rank[i];
  61. Student1.push_back(temp);
  62. }
  63. cout<<"the rank of student1 is: "<<endl;
  64. display(Student1);
  65. cout<<endl<<Student1;
  66. vector<Information>Student2(Student1);
  67. cout<<endl<<"the rank of student2 set is: "<<endl;
  68. display(Student2);
  69. vector<Information>Student3(Student2.begin(),Student2.end()-3);
  70. cout<<endl<<"the size of student3 is: "<<Student3.size()<<endl;
  71. Student3.swap(Student2);
  72. cout<<"the size of student2 is: "<<Student2.size()<<endl;
  73. cout<<"the size of student3 is: "<<Student3.size()<<endl;
  74. Student3.pop_back();
  75. cout<<"Student3's size is: "<<setw(5)<<Student3.size()<<endl;
  76. Student3.erase(Student3.begin());
  77. cout<<"Student3's size is: "<<setw(5)<<Student3.size()<<endl;
  78. display(Student3);
  79. return 0;
  80. }
  1.   示例三:vector元素为vector
  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. #include<iomanip>
  5. #include<windows.h>
  6. using namespace std;
  7. const int n=6;
  8. static int N1=1;
  9. static int N2=N1;
  10. struct Information
  11. {
  12. string studentName;
  13. string studentSex;
  14. double studentRank;
  15. friend ostream &operator<<(ostream& out,Information &p);
  16. friend istream &operator>>(istream& in,vector<Information>&p);
  17. };
  18. ostream &operator<<(ostream& out,vector<Information>&p)//重载输出用算符,可以看到有与display()函数同样的效果
  19. {
  20. cout<<'('<<N1++<<')'<<endl;
  21. for(int i=0;i<n;i++)
  22. out<<"name: "<<setw(10)<<p[i].studentName<<" sex: "<<setw(5)<<p[i].studentSex<<" rank: "<<setw(5)<<p[i].studentRank<<endl;
  23. return out;
  24. }
  25. ostream &operator<<(ostream& out,vector< vector<Information> >&p)
  26. {
  27. cout<<N2++<<": "<<endl;
  28. for(int i=0;i<p.size();i++)
  29. {
  30. cout<<p[i];
  31. cout<<endl;
  32. }
  33. return out;
  34. }
  35. int main()
  36. {
  37. string name[n]={"ZhangSan","liSi","WangMaZi","XiaoMing","XiaoHua","XiaoZhang"};
  38. string sex[n]={"boy","girl","boy","girl","boy","girl"};
  39. int _rank[n]={1,2,3,4,5,6};
  40. vector<string>Name;
  41. vector<string>Sex;
  42. vector<int>Rank;
  43. Name.insert(Name.begin(),name,name+n);
  44. Sex.insert(Sex.begin(),sex,sex+n);
  45. Rank.insert(Rank.begin(),_rank,_rank+n);
  46. vector<Information>Student;
  47. for(int i=0;i<n;i++)
  48. {
  49. Information temp;
  50. temp.studentName=Name[i];
  51. temp.studentSex=Sex[i];
  52. temp.studentRank=Rank[i];
  53. Student.push_back(temp);
  54. }
  55. cout<<Student<<endl;
  56. N1=1;
  57. system("pause");
  58. vector< vector<Information> >VEC;
  59. for(int i=0;i<n;i++)
  60. VEC.push_back(Student);
  61. string name1[n]={"ZhangSan1","liSi2","WangMaZi3","XiaoMing4","XiaoHua5","XiaoZhang6"};
  62. string sex1[n]={"boy1","girl2","boy3","girl4","boy5","girl6"};
  63. int _rank1[n]={11,22,33,44,55,66};
  64. vector<string>Name1;
  65. vector<string>Sex1;
  66. vector<int>Rank1;
  67. Name1.insert(Name1.begin(),name1,name1+n);
  68. Sex1.insert(Sex1.begin(),sex1,sex1+n);
  69. Rank1.insert(Rank1.begin(),_rank1,_rank1+n);
  70. vector<Information>Student1;
  71. for(int i=0;i<n;i++)
  72. {
  73. Information temp;
  74. temp.studentName=Name1[i];
  75. temp.studentSex=Sex1[i];
  76. temp.studentRank=Rank1[i];
  77. Student1.push_back(temp);
  78. }
  79. cout<<VEC;
  80. N1=1;
  81. VEC.insert(VEC.begin()+2,2,Student1);
  82. cout<<VEC;
  83. N1=1;
  84. VEC.erase(VEC.begin()+3);
  85. cout<<VEC;
  86. N1=1;
  87. VEC.pop_back();
  88. cout<<VEC;
  89. //.......
  90. return 0;
  91. }

 

  1. 更多数据结构不再列举
  2. 本文参考了部分网络上的代码示例,加入了笔者自己的一些代码,如有不妥之处,肯请读者指正。

STL—Vector简介的更多相关文章

  1. STL的简介

    Standard Template Library,(标准模板库)<来自百度百科的整理> ————可复用性(reusability) STL是基于模板,内联函数的使用使得生成的代码短小高效 ...

  2. vector 简介

    vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似, 不同的地方就是:数组是静态分配空间,一旦 ...

  3. C++ STL vector容器学习

    STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...

  4. STL vector

    STL vector vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问 ...

  5. STL vector用法介绍

    STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...

  6. STL vector+sort排序和multiset/multimap排序比较

    由 www.169it.com 搜集整理 在C++的STL库中,要实现排序可以通过将所有元素保存到vector中,然后通过sort算法来排序,也可以通过multimap实现在插入元素的时候进行排序.在 ...

  7. STL vector 用法介绍

    介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  8. STL vector使用方法介绍

    介绍 这篇文章的目的是为了介绍std::vector,怎样恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  9. stl——vector详解

    stl——vector详解 stl——vector是应用最广泛的一种容器,类似于array,都将数据存储于连续空间中,支持随机访问.相对于array,vector对空间应用十分方便.高效,迭代器使ve ...

随机推荐

  1. PHP实现快速排序、插入排序、选择排序

    1.快速排序 快速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都 ...

  2. grunt 一个目录下所有的js文件压缩 配置收藏

    module.exports = function(grunt){ // 项目配置 grunt.initConfig({ pkg: grunt.file.readJSON('package.json' ...

  3. LINUX内核参数网络相关

    有助于提高网络性能和吞吐量的参数 net.core.somaxconn = 128 已完成连接队列(completed connection queue) (1)三次握手已经完成,但还未被应用层接收( ...

  4. [转]windows下和Ubuntu下adb找不到设备的解决方法

    最近在做flash手机项目,用fb选择android设备调试,总会出现找不到设备的情况.看了很多帖子都解决不了问题,后来终于研究出来是adb无法找到设备的问题.最后通知这篇帖子终于解决了问题. 使用电 ...

  5. iOS 常用的向上,向下取整, 四舍五入函数

    向上取整:ceil(x),返回不小于x的最小整数; 向下取整:floor(x),返回不大于x的最大整数; 四舍五入:round(x) 截尾取整函数:trunc(x)  

  6. mysql event_scheduler运行一段时间后 自动关闭

    应该是你重启过电脑或重启过服务了.  SELECT * FROM mysql.event;SET GLOBAL event_scheduler = 1; -- 开启定时器 0:off 1:on SHO ...

  7. 只具备内网的服务器通过yum安装软件

    1.在维护过程中,需要统一安装一些软件,可能有的机器只具有内网,有的机器具备外网,可以直接从yum安装,怎么办呢?答:在具备外网的机器上启用yum缓存,这样安装软件的时候本地也缓存了软件安装包,怎样修 ...

  8. java并发编程(一)可重入内置锁

    每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁.线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁.获得内置锁的唯一途径就是进入由这个锁保护的同步代码块 ...

  9. fnc.tld学习编写

    使用 el 的过程中,需要使用到后端代码处理逻辑,这个时候我们就需要自定义 方法. 如我们后端代码定义如下: package com.rhythmk.common; public class FncH ...

  10. WPF整理-为控件添加自定义附加属性

    附加属性 附加属性,大家都不陌生,最常见的是Canvas.Left/Canvas.Top,类似的也有Grid.Row/Grid.Column等附加属性.举个最常见的例子 <Canvas> ...