赞
踩
vector数组是一个能存放任意数据类型(类,结构体,普通变量类型等)的动态数组,在数据结构中就相当于顺序储存的线性表,寻找元素非常快,但是插入元素的时间却很大(list是一个双向链表,在同一个位置插入大量的数据时速度很快,但是查找的速度就会慢很多)
和普通数组一样可以通过下标索引来进行访问
与其它动态序列容器相比(deques, lists and forward_lists), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起lists和forward_lists统一的迭代器和引用更好。
缺点:当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。(比普通的数组具有更高的时间复杂度和空间复杂度)
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
几种定义核初始化的方法:
- vector<int> vec; //声明一个int型向量
- vector<int> vec1(4,1); //vec1的内容为1,1,1,1
- vector<int> vec2{ 1, 2, 3, 4, 5}; //vec2为1,2,3,4,5
- vector<int> vec3(vec1); //也可以直接用vec3=vec1定义
- vector<int> vec4(arr, arr + 5); //将arr数组的元素用于初始化vec向量
- vector<int> vec5(arr,&arr[4]); //1,2,3,4
- vector< vector<int> > vec2(8, vector<int> (8, 0)); //初始化二维数组
- vector<int> dp[5][5]; //初始化二维数组,每个元素为一个vector
- vec3.insert(vec3.end(),vec1.begin(),vec1.end()); //insert方法合并两个vector
- vector<int> vec; vec.resize(n); // 也可视为一种初始化的方式
- vector<int> vec{1,2,3,4};
- vec.push_back(1); //末尾插入 1,2,3,4,1
-
- vector<int>::iterator it = vec.begin(); // 定义一个迭代器
- vec.insert(it,2,5); //在第一个元素前插入2个5
-
- vec.assign(2, 5); // 清除元素,然后插入2个5
使用emplace插入元素,对象会在容器中直接生成,而不是先单独生成对象,然后再把它作为参数传入。
- vector<int> vec{1,2,3,4};
- auto iter = vec.emplace(++begin(vec),5);
- vec.emplace(++iter, 6); // 1,5,6,2,3,4
与之对应的还有emplace_back,push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。
- int x = 1, y=2;
- vector<int> v1(10, x);
- vector<int> v2(20, y);
- v1.swap(v2);
- cout << v1.size()<<'\t'<<v2.size()<< endl;
- 20 10
泛型swap释放vector的内存
因pop_back()和erase删除导致的占用空间
- vector<int> v1(10, x);
- v1.pop_back();
- cout << v1.size() << '\t' << v1.capacity() << endl;
- vector<int>(v1).swap(v1);
- cout << v1.size()<<'\t'<<v1.capacity()<< endl;
- v1.erase(v1.begin());
- cout << v1.size() << '\t' << v1.capacity() << endl;
- vector<int>(v1).swap(v1);
- cout << v1.size() << '\t' << v1.capacity() << endl;
- vector<int> vec{1,2,3,4};
- vec.pop_back(); //删除最后一个元素
- vector<int>::iterator it;
- it = vec.begin();
- vec.erase(it); //删除迭代器指向的元素
- vec.clear() // 清除所有元素
- vec.empty() // 判断是否为空
迭代器
索引
for range
- vector<int> vec{1,2,3,4};
- reverse(vec.begin(), vec.end()); //元素翻转
- sort(vec.begin(), vec.end()); //采用的是从小到大的排序
- bool Comp(const int& a, const int& b) {
- return a > b;
- }
- sort(vec.begin(), vec.end(), Comp); //自定义排序函数
在使用迭代器删除和添加元素时要注意迭代器的变化。
7.1、删除元素
当使用erase删除元素时,返回的迭代器指向被删除元素的下一个元素。
- vector<int> vec{1,2,3,4};
- auto iter = vec.begin();
- for(;iter!=vec.end();){
- if(true){
- iter = vec.erase(iter);
- }
- } // 返回的vector为空
这里我们可能就想问,vector是否支持vec.erase(iter++),需要注意,这种写法对vector、deque等容器无效!
7.2、增加元素
在下面vec的每个元素前插入数字8
- vector<int> vec{1,2,3,4};
- auto iter = vec.begin();
- for(;iter!=vec.end();){
- iter = vec.insert(iter, 8);
- iter++;
- iter++;
- } //8,1,8,2,8,3,8,4
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。