介绍:

首先我们要明白以下几点:

1.vector数组是一个能存放任意数据类型(类,结构,普通变量类型等)的动态数组!,在数据结构中就相当于顺序储存的线性表,寻找元素非常快,但是插入元素的时间却很大(list是一个双向链表,在同一个为止插入大量的数据时速度很快,但是查找的速度就会慢很多)

2.和普通数组一样可以通过下标索引来进行访问

3.与其它动态序列容器相比(deques, lists and forward_lists), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起lists和forward_lists统一的迭代器和引用更好。

4.vector动态数组可以通过数组名进行直接赋值!  vector<yang> c;   vector<yang> b;    b = c;

5.他的缺点:当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。(比普通的数组具有更高的时间复杂度和空间复杂度

vector的常规操作:

vector的定义:

  1. #include<vector>//头文件一定要有
  2.  
  3. using namespace std;//其所在的命名空间
  4.  
  5. vector<int> vec; //声明一个int型向量
  6.  
  7. vector<int> vec1(4,1); //vec1的内容为1,1,1,1
  8. vector<int> vec1{ 1, 2, 3, 4, 5, 6 }; //vec1内容1,2,3,4,5,6
  9.  
  10. vector<int> vec(tmp); //声明并用tmp向量初始化vec向量(也可以用vec=t,p)
  11.  
  12. int arr[5] = {1, 2, 3, 4, 5};
  13. vector<int> vec(arr, arr + 5); //将arr数组的元素用于初始化vec向量
  14. //说明:当然不包括arr[4]元素,末尾指针都是指结束元素的下一个元素,
  15. //这个主要是为了和vec.end()指针统一。
  16. vector<int> vec(&arr[1], &arr[4]); //将arr[1]~arr[4]范围内的元素作为vec的初始值

  

数组插入元素:

1.vec.push_back(同类型量);作用是在vector的末尾插入新元素;

2.insert()第一个参数为迭代器,作用为在迭代器前面插入新元素;

3.assign(5,1)向vector中加入5个1,同时清除掉以前的元素。

  1. std::vector<int> vec1;
  2. vec1.push_back(1);
  3. vec1.push_back(2);
  4. //vec1元素:1,2
  5. std::vector<int> vec2(vec1); //将vec1赋值给vec2
  6. std::vector<int>::iterator it;
  7. it=vec2.begain();
  8. vec2.insert(it,5); //在第一个元素前添加5
  9. it=vec2.begain(); //每当新插入一个元素时内存重新分配所以要重新为迭代器分配指针
  10. vec2.insert(it,2,6);
  11. std::vector<int> vec3(vec2);
  12. vec3.assign(2,5); //清楚所有元素只留两个5

删除元素:

1.pop_back()删除最后一个元素。

2.erase()删除指定位置元素。(其中的参数要是指针变量,比如begain(),end(),以及迭代器值),例如vec.erase(vec.begin()+2);删除第3个元素

3.clear()清除所有元素。

4.empty()判断该数组是否为空

遍历数组:

1.front()访问第一个元素(第一个元素的值而不是地址!begin()相反)

2.back()访问最后一个元素(最后一个元素的值而不是地址!end()相反)

3.size()数组的元素个数

  1. vector<int> a;
  2. //像数组一样以下标访问
  3. for(int i = 0; i < a.size(); i++)
  4. {
  5. cout << a[i];
  6. }
  7.  
  8. //以迭代器访问
  9. vector<int>::iterator it;
  10. for(it=a.begin(); it!=a.end(); it++)
  11. {
  12. cout<<*it<<" " ;
  13. }

翻转和排序的遍历:

  1. #include <algorithm>
  2. reverse(vec.begin(), vec.end())//将元素翻转,即逆序排列!
  3.  
  4. #include <algorithm>
  5. sort(vec.begin(), vec.end()); //采用的是从小到大的排序
  6. //如果想从大到小排序,可以采用上面反转函数,也可以采用下面方法:
  7. bool Comp(const int& a, const int& b) {
  8. return a > b;
  9. }
  10. sort(vec.begin(), vec.end(), Comp);

用vector数组创建二维数组:

  1. //C++ 构建二维动态数组
  2. int **p;
  3. p = new int*[10]; //注意,int*[10]表示一个有10个元素的指针数组
  4. for (int i = 0; i < 10; ++i)
  5. {
  6. p[i] = new int[5];
  7. }
  8.  
  9. //用vector构建二维数组
  10. vector<vector<int>> matrix;
  11. vector<int>a;
  12. a.push_back(1);
  13. a.push_back(3);
  14. a.push_back(1);
  15. matrix.push_back(a);
  16. //或者用下面的方法
  17. int i,j;
  18. vector<vector<int>> array(5);
  19. for (i = 0; i < array.size(); i++)
  20. array[i].resize(3);//这里一定要使用resize其相当于每行的元素数并已经初始化过了

使用注意事项:

迭代器中删除元素的操作时:

删除元素:

  1. std::vector< int> Vec;
  2. std::vector< int>::iterator itVec;
  3. for( itVec = Vec.begin(); itVec != Vec.end(); )
  4. {
  5. if( WillDelete( *itVec) )
  6. {
  7. itVec = Vec.erase( itVec);
  8. }
  9. else
  10. itList++;
  11. }

  

对vector、queue等,每次erase操作,函数会删除指定迭代器位置的元素,然后将后面的元素前移一位,erase返回指向被删除元素下一元素的迭代器。(其实,我认为,返回的还是指定的迭代器,只不过它现在指向了被删除元素的下一元素,如有不对,恳请大家指正!)

对于erase操作,还有一种写法是:Vec.erase(itVec++)

不过需要注意,这种写法对vector、deque等容器无效!

上面两种写法,第一种对各种容器都有效,第二种写法只对map,list等容器有效。为了方便统一,还是建议采取第一种写法。

增加元素:

出于学习的目的,现在提出一个要求,如原有vector为{1,2,3,4,5},现在要在每个元素前加一个8,使vector变为{8,1,8,2,8,3,8,4,8,5}.用循环表示,代码如下:

  1. #include<iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7. vector<int> vec{ 1,2,3,4,5};
  8. auto iter = vec.begin();
  9. for (; iter != vec.end();)
  10. {
  11. iter = vec.insert(iter,8);
  12. iter++;
  13. iter++;
  14. }
  15. for (auto num : vec)
  16. cout << num << endl;
  17. return 0;
  18. }

需要注意的是,insert会将指定对象插入指定迭代器之前的位置,并返回这个位置的迭代器,要想该迭代器指向之前的下一个元素,需要递增两次。

如果需要在每个元素之后插入元素,该怎么操作?

  1. #include<iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7. vector<int> vec{ 1,2,3,4,5};
  8. auto iter = vec.begin();
  9. iter++;
  10. for (; iter != vec.end();)
  11. {
  12. iter = vec.insert(iter,8);
  13. iter++;
  14. iter++;
  15. }
  16. vec.insert(vec.end(),8);
  17. for (auto num : vec)
  18. cout << num << endl;
  19. return 0;
  20. }

  

这里需要对iter首先自增一次,在循环最后,由于iter自加两次,已经和end()函数返回迭代器位置一致,所以需要再insert一次,才能在尾部再插入一个元素。

关于迭代器失效有一篇总结:https://www.cnblogs.com/blueoverflow/p/4923523.html

c++ vector数组的使用的更多相关文章

  1. c++中的array数组和vector数组

    我觉得实验一下会记得比较牢,话不多直接上代码. 下面是array数组,感觉用的不多. //cpp 风格数组 array #include <iostream> #include <a ...

  2. c++ vector数组的定义使用

    /* *********************************************** Author :guanjun Created Time :2017/3/18 13:32:52 ...

  3. 2.vector数组

    创建vector数组 vector<,,,, }; 尾部插入 ; i < ; i++) { myint.push_back(i); } 读取头部和尾部 cout << myin ...

  4. vector数组的相关知识

    Vector 类实现了一个动态数组.和 ArrayList 很相似,但是两者是不同的: Vector 是同步访问的. Vector 包含了许多传统的方法,这些方法不属于集合框架. Vector 主要用 ...

  5. 动态创建二维vector数组 C和C++ 及指针与引用的区别

    二维vectorvector<vector <int> > ivec(m ,vector<int>(n));    //m*n的二维vector 动态创建m*n的二 ...

  6. ArrayList , Vector 数组集合

    ArrayList 的一些认识: 非线程安全的动态数组(Array升级版),支持动态扩容 实现 List 接口.底层使用数组保存所有元素,其操作基本上是对数组的操作,允许null值 实现了 Randm ...

  7. UVa——1593Alignment of Code(string重定向+vector数组)

    UVA - 1593 Alignment of Code Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & ...

  8. C++ 中vector数组的使用

    (1)头文件:#include<vector>.(2)创建vector对象: vector < 类型 > 名字;     例:vector<int> vec;(3) ...

  9. 妙用Pixel bender执行复杂运算/普通数据运算 传递Vector数组

    最近发现pixel bender有两个特殊点: 1.Input Image4,不单单可以用BitmapData来初始化,也可以用Vector.<Number>初始化. 2.ShaderJo ...

随机推荐

  1. 阶段3 3.SpringMVC·_06.异常处理及拦截器_4 SpringMVC拦截器之介绍和搭建环境

    拦截器可以有多个 搭建环境 不用改,直接finish 复制原来项目的 依赖的包也复制过来 web.xml配置前端控制器 springmvc的配置文件 先创建对应的文件夹 分别创建java和resour ...

  2. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_4 响应之返回值是ModelAndView类型

    ModelAndView是SpringMvc提供的一个对象 ModelAndView底层源码用也是ModelMap.ModelMap实现过Model的接口 ModelAndView可以直接new出来. ...

  3. 6、Kubernetes Pod控制器应用进阶

    定义pod时,在spec字段中常用的定义字段有哪些? master ~]# kubectl explain pods.spec.containers KIND: Pod VERSION: v1 RES ...

  4. boost::multi_index 提供一种千人在线即时排行榜的设计思路

    原文地址: http://www.limerence2017.com/2019/06/23/cpp01/ 做游戏或金融后台开发,经常会遇到设计开发排行榜的需求.比如玩家的充值排行,战力排行等等.而这种 ...

  5. 059. Spiral Matrix II

    题目链接:https://leetcode.com/problems/spiral-matrix-ii/description/ Given a positive integer n, generat ...

  6. java8:(Lambda 表达式,Supplier,@FunctionalInterface,foreach(),Optional,Stream().collect,双冒号,joining,partitioningBy分区,collectingAndThen,filter())

    1.Lambda 表达式: 引导:http://www.cnblogs.com/yulinfeng/p/8452379.html DEMO1: List<String> names1 = ...

  7. java:Echarts,POI

    1.Echarts: demo.js: function demo(selector){ var myEcharts=echarts.init(selector); var option = { ti ...

  8. dependencies与devDependencies之间的区别

    dependencies:依赖 dev:develop(开发)的简写 1.--save-dev 和--save 的区别: 我们在使用npm install 安装模块或插件的时候,有两种命令把它们写入到 ...

  9. 分享一款架子鼓游戏【drum】

    视频演示: 电脑版和安卓版都有,没有ios版. 适合想练架子鼓,但是还没买架子鼓的朋友.可以先当做游戏来练练节奏感...下载如下: 电脑版下载>> 手机安卓版下载>>

  10. OpenStack组件——Glance镜像服务

    1.glance介绍 Glance是Openstack项目中负责镜像管理的模块,其功能包括虚拟机镜像的查找.注册和检索等. Glance提供Restful API可以查询虚拟机镜像的metadata及 ...