C++ STL 容器 vector

1 vector简介

顺序存储, 初始化过程会分配一定量空间, 在尾部插入会很快, 但是在中间插入元素, 会把之后所有元素向后平移, 所以较慢(中间删除元素同理). 如果元素个数超过当前限制, 会重新分配更大空间, 再把原容器中所有元素都拷贝到新的容器中.

  • 优点: 支持随机访问(用下标访问), 性能较好
  • 缺点: 除了操作尾部元素, 增删中间元素性能较差

2 vector接口

  • push_back() 尾插数据
  • pop_back() 尾删数据
  • front() 第一个元素
  • back() 最后一个元素

构造:

void vector_constructor_test() {int array[] = {0,1,2,3,4,5,6,7,8,9};vector<int> testVec = TestUtils::getInstance()->getVectorByArr(PARAM_ARRAY(array));TestUtils::getInstance()->showVector(testVec);vector<int> testVec1(testVec.begin(), testVec.end());   // copy [testVec.begin(), testVec.end())TestUtils::getInstance()->showVector(testVec1);vector<int> testVec2(&array[0], &array[8]);             // copy array[0, 8)TestUtils::getInstance()->showVector(testVec2);vector<int> testVec3(10, 100);TestUtils::getInstance()->showVector(testVec3);         // testVec3 have 10 elements, every element is 100vector<int> testVec4;testVec4.assign(testVec.begin(), testVec.end());        // copy testVec[begin(), end())TestUtils::getInstance()->showVector(testVec4);
}

结果:

2.1 vector容量和大小

void vector_size_capacity_test() {int array[] = {0,1,2,3,4,5,6,7,8,9};vector<int> testVec = TestUtils::getInstance()->getVectorByArr(PARAM_ARRAY(array));cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl;testVec.resize(15);                                             // if resize number > vec.size(), willTestUtils::getInstance()->showVector(testVec);                  // fill with 0cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl;testVec.resize(5);TestUtils::getInstance()->showVector(testVec);cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl;testVec.resize(15, 8);TestUtils::getInstance()->showVector(testVec);cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl;
}

结果为:

2.2 增删

void vector_add_delete_test() {int array[] = {0,1,2,3,4,5,6,7,8,9};vector<int> testVec = TestUtils::getInstance()->getVectorByArr(PARAM_ARRAY(array));testVec.push_back(10);                              // add to backTestUtils::getInstance()->showVector(testVec);testVec.pop_back();                                 // delete backTestUtils::getInstance()->showVector(testVec);testVec.insert(testVec.begin(), 10);                // insert to headTestUtils::getInstance()->showVector(testVec);testVec.insert(testVec.begin(), 2, 100);            // insert two 100 to headTestUtils::getInstance()->showVector(testVec);testVec.erase(testVec.begin());                     // delete headTestUtils::getInstance()->showVector(testVec);testVec.erase(testVec.begin(), testVec.begin() + 2);// delete head to head + 2(not include head + 2)TestUtils::getInstance()->showVector(testVec);cout << "testVec.front(): " << testVec.front() << endl;cout << "testVec.back(): " << testVec.back() << endl;
}

结果:

 

2.2 互换

void vector_swap_test() {int array1[] = {0,1,2,3,4,5,6,7,8,9};vector<int> testVec1 = TestUtils::getInstance()->getVectorByArr(PARAM_ARRAY(array1));int array2[] = {10,11,12,13,14,15,16,17,18,19};vector<int> testVec2 = TestUtils::getInstance()->getVectorByArr(PARAM_ARRAY(array2));TestUtils::getInstance()->showVector(testVec1);TestUtils::getInstance()->showVector(testVec2);testVec1.swap(testVec2);TestUtils::getInstance()->showVector(testVec1);TestUtils::getInstance()->showVector(testVec2);
}

运行结果为:

用途如以下测试代码:

void vector_swap_test1() {vector<int> testVec;for (int i = 0; i < 100000; i ++) {testVec.push_back(i);}cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl;testVec.resize(10);cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl;
}

 结果是:

所以可以用swap收缩:

void vector_swap_test1() {vector<int> testVec;for (int i = 0; i < 100000; i ++) {testVec.push_back(i);}cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl;testVec.resize(10);cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl;vector<int>(testVec).swap(testVec);cout << "testVec.size(): " << testVec.size() << endl;cout << "testVec.capacity(): " << testVec.capacity() << endl;
}

结果是:

原因是vector<int>(testVec).swap(testVec);调用时, 相当于用testVec创建了一个匿名对象vector<int> (testVec), 这个匿名对象的size和capacity都是10, 元素就是testVec的十个元素, 然后这个匿名对象和testVec作了交换之后, 匿名对象变成了十万个元素, 而testVec变成了size和capacity都是10, 匿名对象在行结束后立刻销毁, 所以原来哪个100000个元素的匿名对象就销毁了, 这样就达到了缩容的目的.

2.3 预留空间

reserve. 调用reserve可以减少重新分配空间的时间, 但是和resize不同的是, 元素不会被初始化为0.

比如有如下函数, 我们可以验证vector在加入了100000个元素之后一共重新分配了多少次内存.有两种方法:

  • 看序列首元素地址改变了多少次
  • 看vector的size和capacity相等了多少次
void vector_allocate_test1(){vector<int> testVec;int *p = NULL;int number1 = 0;int number2 = 0;for (int i = 0; i < 100000; i ++) {if (testVec.size() == testVec.capacity())number1 ++;testVec.push_back(i);if (p != &testVec[0]) {p = &testVec[0];number2 ++;}}cout << "number1 = " << number1 << endl;cout << "number2 = " << number2 << endl;
}

结果是:

发现重新分配了18次.我们可以用以下代码来测试一下性能:

void vector_allocate_test2(){double startTime = TestUtils::getInstance()->getNowMillisecond();vector<int> testVec1;for (int i = 0; i < 100000; i ++) {testVec1.push_back(i);}double endTime = TestUtils::getInstance()->getNowMillisecond();cout << "use " << endTime - startTime << "ms" << endl;startTime = TestUtils::getInstance()->getNowMillisecond();vector<int> testVec2;testVec2.reserve(100000);for (int i = 0; i < 100000; i ++) {testVec2.push_back(i);}endTime = TestUtils::getInstance()->getNowMillisecond();cout << "use " << endTime - startTime << "ms after reserve" << endl;
}

结果为:

 

3 迭代器

假如有如下一个vector:

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))vector<int> intVec;
int array[] = {0, 1, 2, 3, 4, 5};
for (int i = 0; i < ARRAY_SIZE(array); i ++) {inVec.push_back(arr[i]);
}

那么如下迭代器:

vector<int>::iterator beginIter = intVec.begin(); //beginIter指向vector首元素vector<int>::iterator endIter = intVec.end(); //endIter指向vector最后元素的下一个位置

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3dmax卸载工具_3dmax软件如何彻底卸载?

近期有很多学员遇到关于3dmax软件卸载的问题&#xff0c;有的是想安装更高版本但不知道如何卸载更安全&#xff0c;有的是自己卸载了之后再安装其他版本却总是无法成功&#xff0c;这对此类问题&#xff0c;今天我做一个详细讲解&#xff1b;根据自己所遇问题&#xff0c;找到最…

华为app安装失败与已安装签名_手机APP为什么总是安装失败

整天“机不离手”的我们每个人手机里都装有好几十个APP但安装的时候总会出现跳出手机APP无法安装或安装失败的页面这究竟是怎么回事呢&#xff1f;小翼带你瞅瞅一、手机安全认证在安装或下载应用程序时&#xff0c;如果提示失败可能是因为系统“未知来源”没有开启。可以通过打…

C++ STL 中提供的算法

1 算法 1.1 for_each() 参数有三个: 首迭代器尾迭代器执行的函数 例如如下代码: #include <algorithm> //必须包含 #include <vector> using namespace std;int main() {vector<int> tmp;tmp.push_back(10);tmp.push_back(20);tmp.push_back(30);tmp.pu…

arma模型_GARCH模型应用:以国泰君安为例

1.下载国泰君安股票数据&#xff0c;计算对数收益率(1)首先安装包"quantmod"&#xff0c;这个包可以从雅虎财经的下载股票数据&#xff0c;具体包的解释见"【量化基础】R语言获取金融数据之quantmod包"。install.packages("quantmod")#安装包qua…

C++ STL 容器 string

1 string string内部含有一个char*字符串 2 string构造方式 无参构造 string str; 字符串构造 string str("abcd"); 拷贝构造n个相同字符 string str(10, k); //初始化为10个k 3 string赋值操作 可以有以下操作: void string_test() {string str1;str1 &qu…

小程序webview不全屏_小程序不在小(深度)

原标题&#xff1a;小程序不在小(深度)你问&#xff1a;“微信小程序适合哪些行业?”&#xff0c;回答是&#xff1a;“所有行业!”你可以想一下那些做过APP的公司&#xff0c;不管是任何行业的公司都可以拥有属于自己的APP&#xff0c;而从来不会有人问他们你们用的APP是否适…

leetcode 4 --- 寻找两个有序数组的中位数

1 题目 给定两个大小为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。 进阶&#xff1a;设计一个时间复杂度为 O(log (mn)) 的算法. 2 解法 这个题如果mn是偶数, 就是找到第(mn)/2以及第(mn)/2 1个数, 如果…

leetcode 142 --- linked-list-cycle-ii

1 题目&#xff1a; 对于一个给定的链表&#xff0c;返回环的入口节点&#xff0c;如果没有环&#xff0c;返回null 拓展&#xff1a; 你能给出不利用额外空间的解法么&#xff1f; 代码&#xff1a; class Solution { public:ListNode *detectCycle(ListNode *head) {} …

百度搜索引擎优化指南3.0_深圳网站搜索引擎排名优化电话,百度优化排名费用_华阳网络...

天津华阳在线科技有限公司为您详细解读深圳网站搜索引擎排名优化电话,百度优化排名费用的相关知识与详情&#xff1a;网站的主页标题是百度SEO的关键。你想要的主要关键词应该反映在标题中。如果标题写得好&#xff0c;百度很快就收录进去了。但要记住&#xff0c;有一点&#…

C++ STL 容器的一些总结 --- set(multiset)和map(multimap)

1 set和multiset 1.1 插入元素方式 set只能用insert插入数据. insert返回值是一个pair<iterator, bool>, 即插入数据的迭代器以及是否插入成功, multiset返回的只有迭代器, 因为不会插入失败. 1.2 删除 set只能用erase, 可以传迭代器或者是值. 1.3 注意事项 不允许…

苹果自带相册打马赛克_剪映app怎么给视频局部打马赛克

剪映app怎么给视频局部打马赛克呢&#xff1f;很多用户对此还不是很清楚&#xff0c;小编这里就给大家带来有关剪映app怎么给视频局部打马赛克的回答&#xff0c;希望能够对大家有所帮助。1、首先打开剪映app&#xff0c;进入首页后点击开始创作选项&#xff0c;2、这时选择需要…

excel表格如何转换成word表格_如何将excel转换成pdf?excel表格可以变成pdf文件吗?...

文字使用word&#xff0c;数据使用Excel&#xff0c;这应该是咱们日常生活中的一个规律了吧&#xff1f;不过不管是word文档还是Excel文档&#xff0c;都是可以被编辑修改的&#xff0c;那么我们怎么才能让它变得不能被编辑修改呢&#xff1f;小编这里还真有一个好方法&#xf…

python车牌识别系统开源代码_天津谁做车牌识别系统供应商,伸缩栅栏门_郑州荣锋科技有限公司...

首页 > 新闻中心发布时间&#xff1a;2020-11-13 22:54:57 导读&#xff1a;郑州荣锋科技有限公司为您提供天津谁做车牌识别系统供应商,伸缩栅栏门的相关知识与详情&#xff1a; (1)门处于关闭状态&#xff0c;控制器应骆动执行电机以佳速度曲线打开门;圆弧形自动门卷帘门机…

收发一体超声波测距离传感器模块_一文了解超声波液位计

为什么选择超声波液位计&#xff1f;因为&#xff0c;超声波液位计由声波的发射和接收之间的时间来计算传感器到被测物体的距离。无机械可动部分&#xff0c;可靠性高&#xff0c;安装简单、方便&#xff0c;属于非接触测量&#xff0c;且不受液体的粘度、密度等影响精度比较低…

什么牌子的平板电脑好_平板电脑什么牌子好?带你一探年度最佳平板的奥秘

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以免费收到最新内容了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。声明&#xff1a;本文转载自网络&#xff0c;如有侵权&#xff0c;请在后台留言联系…

ieee754浮点数转换工具_关于JS浮点数运算不精确的原因和解决方案

背景之前在一个项目中&#xff0c;涉及到了金额&#xff0c;协议组定的标准是按照分的单位进行传递的&#xff0c;但是交互上&#xff0c;web页面中为了更友好的体验&#xff0c;是使用的元作为单位的&#xff0c;这个时候就需要转换一下单位本来是很简单的一个转化的需求&…

fir滤波器matlab实现_关于FIRamp;IIR系统的算法说明以及结果验证(1)

首先&#xff0c;做一个简短的开场白。本贴主要是一个关于信号处理方面的学习笔记。主要目的有三&#xff0c;作为研究笔记留存分享我个人的理解与专业人士进行意见交换另外由于楼主不是教课员&#xff0c;因此无法保证算法分析以及个人理解的完全正确性&#xff0c;若本人对知…

操作系统中的全局页面置换算法

1 全局页面置换算法 以上页面置换算法都是针对单一的应用程序的页面置换算法, 且有一个前提, 就是给单一应用程序分配的物理页帧数量是一定的. 现实中, 给一个应用程序分配的物理页帧数, 该程序产生的缺页中断也就越少, 而且程序运行过程中, 可能某些阶段对于内存的读写操作很…

怎么更新opengl.dll文件_安装累积更新丢文件似乎已成为惯例 KB4556799同样出现文件丢失问题...

从 Windows 10 Version 1903 版发布开始就经常出现用户升级版本或者安装累积更新导致个人文件丢失的问题。但是以前这种问题似乎并不算频繁&#xff0c;然而从今年开始微软发布的累积更新几乎都存在这样的问题让很多用户苦恼。而微软至今从未承认过安装累积更新会丢失用户的个人…

非全局页面置换算法

1 先进先出算法(FIFO) 1.1 基本思路: 选择在内存中驻留时间最长的页面并淘汰之. 具体来说, 系统维护着一个链表, 记录了所有位于内存当中的逻辑页面. 从链表的排列顺序来看, 链首页面的驻留时间最长, 链尾页面的驻留时间最短. 当发生一个缺页中断时, 把链首页面的淘汰出局, 并…