vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组。像数组一样,vector类也用从0开始的下标表示元素的位置;但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和缩小而自动变化。

vector类常用的函数如下所示:

1.构造函数

  • vector():创建一个空vector
  • vector(int nSize):创建一个vector,元素个数为nSize
  • vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
  • vector(const vector&):复制构造函数
  • vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中

2.增加函数

  • void push_back(const T& x):向量尾部增加一个元素X
  • iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
  • iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
  • iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

3.删除函数

  • iterator erase(iterator it):删除向量中迭代器指向元素
  • iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
  • void pop_back():删除向量中最后一个元素
  • void clear():清空向量中所有元素

4.遍历函数

  • reference at(int pos):返回pos位置元素的引用
  • reference front():返回首元素的引用
  • reference back():返回尾元素的引用
  • iterator begin():返回向量头指针,指向第一个元素
  • iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
  • reverse_iterator rbegin():反向迭代器,指向最后一个元素
  • reverse_iterator rend():反向迭代器,指向第一个元素之前的位置

5.判断函数

  • bool empty() const:判断向量是否为空,若为空,则向量中无元素

6.大小函数

  • int size() const:返回向量中元素的个数
  • int capacity() const:返回当前向量张红所能容纳的最大元素值
  • int max_size() const:返回最大可允许的vector元素数量值

7.其他函数

  • void swap(vector&):交换两个同类型向量的数据
  • void assign(int n,const T& x):设置向量中第n个元素的值为x
  • void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素

示例:

1.初始化示例

  1. #include "stdafx.h"
  2. #include<iostream>
  3. #include<vector>
  4. using namespace std;
  5. class A
  6. {
  7. //空类
  8. };
  9. int _tmain(int argc, _TCHAR* argv[])
  10. {
  11. //int型vector
  12. vector<int> vecInt;
  13. //float型vector
  14. vector<float> vecFloat;
  15. //自定义类型,保存类A的vector
  16. vector<A> vecA;
  17. //自定义类型,保存指向类A的指针的vector
  18. vector<A*> vecPointA;
  19. return 0;
  20. }

  1. // vectorsample.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include<iostream>
  5. #include<vector>
  6. using namespace std;
  7. class A
  8. {
  9. //空类
  10. };
  11. int _tmain(int argc, _TCHAR* argv[])
  12. {
  13. //int型vector,包含3个元素
  14. vector<int> vecIntA(3);
  15. //int型vector,包含3个元素且每个元素都是9
  16. vector<int> vecIntB(3,9);
  17. //复制vecIntB到vecIntC
  18. vector<int> vecIntC(vecIntB);
  19. int iArray[]={2,4,6};
  20. //创建vecIntD
  21. vector<int> vecIntD(iArray,iArray+3);
  22. //打印vectorA,此处也可以用下面注释内的代码来输出vector中的数据
  23. /*for(int i=0;i<vecIntA.size();i++)
  24. {
  25. cout<<vecIntA[i]<<"     ";
  26. }*/
  27. cout<<"vecIntA:"<<endl;
  28. for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
  29. {
  30. cout<<*it<<"     ";
  31. }
  32. cout<<endl;
  33. //打印vecIntB
  34. cout<<"VecIntB:"<<endl;
  35. for(vector<int>::iterator it = vecIntB.begin() ;it!=vecIntB.end();it++)
  36. {
  37. cout<<*it<<"     ";
  38. }
  39. cout<<endl;
  40. //打印vecIntC
  41. cout<<"VecIntB:"<<endl;
  42. for(vector<int>::iterator it = vecIntC.begin() ;it!=vecIntC.end();it++)
  43. {
  44. cout<<*it<<"     ";
  45. }
  46. cout<<endl;
  47. //打印vecIntD
  48. cout<<"vecIntD:"<<endl;
  49. for(vector<int>::iterator it = vecIntD.begin() ;it!=vecIntD.end();it++)
  50. {
  51. cout<<*it<<"     ";
  52. }
  53. cout<<endl;
  54. return 0;
  55. }

程序的运行结果如下:


上面的代码用了4种方法建立vector并对其初始化

2.增加及获得元素示例:

  1. // vectorsample.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include<iostream>
  5. #include<vector>
  6. using namespace std;
  7. int _tmain(int argc, _TCHAR* argv[])
  8. {
  9. //int型vector,包含3个元素
  10. vector<int> vecIntA;
  11. //插入1 2 3
  12. vecIntA.push_back(1);
  13. vecIntA.push_back(2);
  14. vecIntA.push_back(3);
  15. int nSize = vecIntA.size();
  16. cout<<"vecIntA:"<<endl;
  17. //打印vectorA,方法一:
  18. for(int i=0;i<nSize;i++)
  19. {
  20. cout<<vecIntA[i]<<"     ";
  21. }
  22. cout<<endl;
  23. //打印vectorA,方法二:
  24. for(int i=0;i<nSize;i++)
  25. {
  26. cout<<vecIntA.at(i)<<"     ";
  27. }
  28. cout<<endl;
  29. //打印vectorA,方法三:
  30. for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
  31. {
  32. cout<<*it<<"     ";
  33. }
  34. cout<<endl;
  35. return 0;
  36. }

上述代码对一个整形向量类进行操作,先定义一个整形元素向量类,然后插入3个值,并用3种不同的方法输出,程序运行结果如下:



  1. // vectorsample.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include<iostream>
  5. #include<vector>
  6. using namespace std;
  7. class A
  8. {
  9. public:
  10. int n;
  11. public:
  12. A(int n)
  13. {
  14. this->n = n;
  15. }
  16. };
  17. int _tmain(int argc, _TCHAR* argv[])
  18. {
  19. //int型vector,包含3个元素
  20. vector<A> vecClassA;
  21. A a1(1);
  22. A a2(2);
  23. A a3(3);
  24. //插入1 2 3
  25. vecClassA.push_back(a1);
  26. vecClassA.push_back(a2);
  27. vecClassA.push_back(a3);
  28. int nSize = vecClassA.size();
  29. cout<<"vecClassA:"<<endl;
  30. //打印vecClassA,方法一:
  31. for(int i=0;i<nSize;i++)
  32. {
  33. cout<<vecClassA[i].n<<"     ";
  34. }
  35. cout<<endl;
  36. //打印vecClassA,方法二:
  37. for(int i=0;i<nSize;i++)
  38. {
  39. cout<<vecClassA.at(i).n<<"     ";
  40. }
  41. cout<<endl;
  42. //打印vecClassA,方法三:
  43. for(vector<A>::iterator it = vecClassA.begin();it!=vecClassA.end();it++)
  44. {
  45. cout<<(*it).n<<"     ";
  46. }
  47. cout<<endl;
  48. return 0;
  49. }

上述代码通过定义元素为类的向量,通过插入3个初始化的类,并通过3种方法输出,运行结果如下:

  1. // vectorsample.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include<iostream>
  5. #include<vector>
  6. using namespace std;
  7. class A
  8. {
  9. public:
  10. int n;
  11. public:
  12. A(int n)
  13. {
  14. this->n = n;
  15. }
  16. };
  17. int _tmain(int argc, _TCHAR* argv[])
  18. {
  19. //int型vector,包含3个元素
  20. vector<A*> vecClassA;
  21. A *a1 = new A(1);
  22. A *a2 = new A(2);
  23. A *a3 = new A(3);
  24. //插入1 2 3
  25. vecClassA.push_back(a1);
  26. vecClassA.push_back(a2);
  27. vecClassA.push_back(a3);
  28. int nSize = vecClassA.size();
  29. cout<<"vecClassA:"<<endl;
  30. //打印vecClassA,方法一:
  31. for(int i=0;i<nSize;i++)
  32. {
  33. cout<<vecClassA[i]->n<<"\t";
  34. }
  35. cout<<endl;
  36. //打印vecClassA,方法二:
  37. for(int i=0;i<nSize;i++)
  38. {
  39. cout<<vecClassA.at(i)->n<<"\t";
  40. }
  41. cout<<endl;
  42. //打印vecClassA,方法三:
  43. for(vector<A*>::iterator it = vecClassA.begin();it!=vecClassA.end();it++)
  44. {
  45. cout<<(**it).n<<"\t";
  46. }
  47. cout<<endl;
  48. delete a1; delete a2;delete a3;
  49. return 0;
  50. }

上述代码通过定义元素为类指针的向量,通过插入3个初始化的类指针,并通过3种方法输出指针指向的类,运行结果如下:

3.修改元素示例

修改元素的方法主要有三种:1.通过数组修改,2.通过引用修改,3.通过迭代器修改
  1. // vectorsample.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include<iostream>
  5. #include<vector>
  6. using namespace std;
  7. int _tmain(int argc, _TCHAR* argv[])
  8. {
  9. //int型vector,包含3个元素
  10. vector<int> vecIntA;
  11. //插入1 2 3
  12. vecIntA.push_back(1);
  13. vecIntA.push_back(2);
  14. vecIntA.push_back(3);
  15. int nSize = vecIntA.size();
  16. //通过引用修改vector
  17. cout<<"通过数组修改,第二个元素为8:"<<endl;
  18. vecIntA[1]=8;
  19. cout<<"vecIntA:"<<endl;
  20. //打印vectorA
  21. for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
  22. {
  23. cout<<*it<<"     ";
  24. }
  25. cout<<endl;
  26. //通过引用修改vector
  27. cout<<"通过引用修改,第二个元素为18:"<<endl;
  28. int &m = vecIntA.at(1);
  29. m=18;
  30. cout<<"vecIntA:"<<endl;
  31. //打印vectorA
  32. for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
  33. {
  34. cout<<*it<<"     ";
  35. }
  36. cout<<endl;
  37. //通过迭代器修改vector
  38. cout<<"通过迭代器修改,第二个元素为28"<<endl;
  39. vector<int>::iterator itr = vecIntA.begin()+1;
  40. *itr = 28;
  41. cout<<"vecIntA:"<<endl;
  42. //打印vectorA
  43. for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
  44. {
  45. cout<<*it<<"     ";
  46. }
  47. cout<<endl;
  48. return 0;
  49. }

程序运行结果如下:



4.删除向量示例

删除向量主要通过erase和pop_back,示例代码如下
  1. // vectorsample.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include<iostream>
  5. #include<vector>
  6. using namespace std;
  7. int _tmain(int argc, _TCHAR* argv[])
  8. {
  9. //int型vector,包含3个元素
  10. vector<int> vecIntA;
  11. //循环插入1 到10
  12. for(int i=1;i<=10;i++)
  13. {
  14. vecIntA.push_back(i);
  15. }
  16. vecIntA.erase(vecIntA.begin()+4);
  17. cout<<"删除第5个元素后的向量vecIntA:"<<endl;
  18. //打印vectorA
  19. for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
  20. {
  21. cout<<*it<<"\t";
  22. }
  23. cout<<endl;
  24. //删除第2-5个元素
  25. vecIntA.erase(vecIntA.begin()+1,vecIntA.begin()+5);
  26. cout<<"删除第2-5个元素后的vecIntA:"<<endl;
  27. //打印vectorA
  28. for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
  29. {
  30. cout<<*it<<"\t";
  31. }
  32. cout<<endl;
  33. //删除最后一个元素
  34. vecIntA.pop_back();
  35. cout<<"删除最后一个元素后的vecIntA:"<<endl;
  36. //打印vectorA
  37. for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++)
  38. {
  39. cout<<*it<<"\t";
  40. }
  41. cout<<endl;
  42. return 0;
  43. }

程序运行结果如下:



3.进一步理解vector,如下图所示:


    当执行代码vector<int> v(2,5)时,在内存里建立了2个整形元素空间,值是5.当增加一个元素时,原有的空间由2个编程4个整形元素空间,并把元素1放入第3个整形空间,第4个空间作为预留空间。当增加元素2时,直接把值2放入第4个空间。当增加元素3时,由于原有向量中没有预留空间,则内存空间由4个变为8个整形空间,并把值放入第5个内存空间。
   总之,扩大新元素时,如果超过当前的容量,则容量会自动扩充2倍,如果2倍容量仍不足,则继续扩大2倍。本图是直接在原空间基础上画的新增空间,其实要复杂的多,包括重新配置、元素移动、释放原始空间的过程。因此对vector容器而言,当增加新的元素时,有可能很快完成(直接存在预留空间中),有可能稍慢(扩容后再放新元素);对修改元素值而言是较快的;对删除元素来说,弱删除尾部元素较快,非尾部元素稍慢,因为牵涉到删除后的元素移动。

4.综合示例

  1. // vectorsample.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include<iostream>
  5. #include<vector>
  6. #include<string>
  7. using namespace std;
  8. class Student
  9. {
  10. public:
  11. string m_strNO;
  12. string m_strName;
  13. string m_strSex;
  14. string m_strDate;
  15. public:
  16. Student(string strNO,string strName,string strSex,string strDate)
  17. {
  18. m_strNO = strNO;
  19. m_strName = strName;
  20. m_strSex = strSex;
  21. m_strDate = strDate;
  22. }
  23. void Display()
  24. {
  25. cout<<m_strNO<<"\t";
  26. cout<<m_strName<<"\t";
  27. cout<<m_strSex<<"\t";
  28. cout<<m_strDate<<"\t";
  29. }
  30. };
  31. class StudCollect
  32. {
  33. vector<Student> m_vStud;
  34. public:
  35. void Add(Student &s)
  36. {
  37. m_vStud.push_back(s);
  38. }
  39. Student* Find(string strNO)
  40. {
  41. bool bFind = false;
  42. int i;
  43. for(i = 0;i < m_vStud.size();i++)
  44. {
  45. Student& s = m_vStud.at(i);
  46. if(s.m_strNO == strNO)
  47. {
  48. bFind = true;
  49. break;
  50. }
  51. }
  52. Student *s = NULL;
  53. if(bFind)
  54. s = &m_vStud.at(i);
  55. return s;
  56. }
  57. };
  58. int _tmain(int argc, _TCHAR* argv[])
  59. {
  60. Student s1("1001","zhangsan","boy","1988-10-10");
  61. Student s2("1002","lisi","boy","1988-8-25");
  62. Student s3("1003","wangwu","boy","1989-2-14");
  63. StudCollect s;
  64. s.Add(s1);
  65. s.Add(s2);
  66. s.Add(s3);
  67. Student *ps = s.Find("1002");
  68. if(ps)
  69. ps->Display();
  70. return 0;
  71. }

代码运行实例如下:


STL:vector容器用法详解的更多相关文章

  1. STL vector常见用法详解

    <算法笔记>中摘取 vector常见用法详解 1. vector的定义 vector<typename> name; //typename可以是任何基本类型,例如int, do ...

  2. STL之二:vector容器用法详解

    转载于:http://blog.csdn.net/longshengguoji/article/details/8507394 vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组. ...

  3. C++标准模板库(STL)——vector常见用法详解

    vector的定义 vector<typename> name; 相当于定义了一个一维数组name[SIZE],只不过其长度可以根据需要进行变化,比较节省空间,通俗来讲,vector就是& ...

  4. vector容器用法详解

    vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组.像数组一样,vector类也用从0开始的下标表示元素的位置:但和数组不同的是,当vector对象创建后,数组的元素个数会随着ve ...

  5. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

  6. C++中的STL中map用法详解(转)

    原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解   Map是STL的一个关联容器,它提供 ...

  7. STL priority_queue 常见用法详解

    <算法笔记>学习笔记 priority_queue 常见用法详解 //priority_queue又称优先队列,其底层时用堆来实现的. //在优先队列中,队首元素一定是当前队列中优先级最高 ...

  8. STL set 常见用法详解

    <算法笔记>学习笔记 set 常见用法详解 set是一个内部自动有序且不含重复元素的容器 1. set 的定义 //单独定义一个set set<typename> name: ...

  9. STL stack 常见用法详解

    <算法笔记>学习笔记 stack 常见用法详解 stack翻译为栈,是STL中实现的一个后进先出的容器.' 1.stack的定义 //要使用stack,应先添加头文件#include &l ...

随机推荐

  1. Spring cloud 学习资料整理

    推荐博客 纯洁的微笑 程序猿DD liaokailin的专栏 周立 Spring Cloud 方志朋 Spring Cloud 专栏 许进 跟我学Spring Cloud 推荐网站 Spring Cl ...

  2. 吴恩达深度学习第1课第3周编程作业记录(2分类1隐层nn)

    2分类1隐层nn, 作业默认设置: 1个输出单元, sigmoid激活函数. (因为二分类); 4个隐层单元, tanh激活函数. (除作为输出单元且为二分类任务外, 几乎不选用 sigmoid 做激 ...

  3. vmware迁移到openstack的一些坑

    title: 安全平台迁移 tags: 新建,模板,小书匠 grammar_cjkRuby: true --- 前言 主要有三个坑: 一是如果原先虚拟机没有安装virtio驱动,要设置设备驱动为ide ...

  4. page1

    1.1 常用的客户端技术:HTML. CSS. 客户端脚本技术 1.2 常用的服务器端技术:CGI .ASP .PHP (一种开发动态网页技术).ASP.NET(是一种建立动态web应用程序的技术,是 ...

  5. Visual studio debug—Process with an Id of 5616 is not running的解决方法

    今天调试的时候,碰到下面的问题 打开项目的csproj文件,拉到最下方找我我图中红框中的部分,删除它即可.

  6. eclipse properties 插件

    eclipse properties 插件安装,分享牛,分享牛原创.eclipse properties 编辑器使用. eclipse因为是原生的,可能集成的插件不多,需要自己手动安装.eclipse ...

  7. 【安卓开发】Android为什么选择binder

    Binder (Android技术内幕): 在上面这些可供选择的方式中,Android使用得最多也最被认可的还是Binder机制. 为什么会选择Binder来作为进程之间的通信机制呢?因为Binder ...

  8. 在OC代码中创建Swift编写的视图控制器

    背景 近日在和一群朋友做项目,我和另一位同学负责iOS客户端,我是一直使用OC的,而他只会Swift,因此在我们分工协作之后,就需要把代码合在一起,这就牵扯到如何在TabbarController中添 ...

  9. TCP的发送系列 — 发送缓存的管理(一)

    主要内容:TCP发送缓存的初始化.动态调整.申请和释放. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 数据结构 TCP对发送缓存的管理是在两个层面上进 ...

  10. 3. React 组件生命周期介绍

            React 中的每个组件都有三个阶段,这三个阶段构成了组件完整的生命周期.组件的生命周期为]); return; } this.setState({name: event.target ...