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最后元素的下一个位置

C++ STL 容器 vector相关推荐

  1. c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件

    Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...

  2. vector 清空 Linux,STL容器vector基础用法小结

    STL容器vector基础用法小结根据<ACM程序设计>写的,用实例展示vector用法. 方法:push_back(), insert(), erase(), clear(), size ...

  3. oracle erase,c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件

    Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...

  4. C++ STL: 容器vector源码分析

    文章目录 前言 vector的核心接口 vector push_back实现 vector 的 Allocator vector 的 push_back 总结 前言 vector 是我们C++STL中 ...

  5. C++STL容器vector

    vector简介 vector模塑出一个dynamic array,即动态数组.它本身是一个 "将元素置于dynamic array加以管理的抽象概念",属于序列式容器. 使用条件 ...

  6. C++ STL容器vector篇(一) vector容器存放内置和自定义数据类型并遍历

    写在前面 存放内置数据类型 代码 存放自定义数据类型 代码 总结 写在前面 本文算是B站黑马C++课程STL-vector部分的一个总结, 包含自己的一些想法(都在代码里了). 存放内置数据类型 以i ...

  7. C++ STL容器vector篇(五) vector容器常用初始化操作总结(一维/二维)

    `vector`初始化方法 一维向量 二维向量 参考 vector初始化方法 一维向量 #include <iostream> #include <vector>using n ...

  8. C++ STL容器vector篇(三) vector容器大小和数组大小, 插入和删除元素, 存储和读取元素

    vector容器的大小(capacity)和存放数据的大小(size) #include <iostream> #include <vector>using namespace ...

  9. C++ STL容器vector篇(二) vector容器的构造函数与赋值操作

    构造函数 构造函数的调用有四种方式: 默认构造函数(无参构造); 左闭右开区间元素拷贝给容器本身; 构造函数将n个elem拷贝给容器本身; 拷贝构造函数 代码如下: #include <iost ...

最新文章

  1. Yii 错误页面处理
  2. 华为S5348交换机基本配置
  3. Day3:数据类型(布尔值、集合)
  4. Eltwise_layer简介
  5. OpenMMLab 生成模型算法库发布,打工人也能玩转图像生成!
  6. Entityframework core 动态添加模型实体
  7. 因使用五年前的老旧代码,Azure 容器险遭黑客接管,微软已修复
  8. 微软 Edge 浏览器被指共享隐私遥测数据
  9. 在VS2017(VC15)上配置opencv4.0.1环境
  10. android获取角速度,android dyrscope sensor 角速度传感器调试
  11. 使用 cookie的一些缺陷和隐患
  12. 如何利用python爬取豆瓣250排行电影
  13. C++ + win32 + STL 写的QQ连连看外挂
  14. [转]这些道理不懂,你注定就是穷打工的命
  15. 微软:区块链BaaS平台将成为重要盈…
  16. [技术] OIer的C++标准库 : STL入门
  17. jpg格式电脑怎么弄_(常见问题)如何把HEIC格式图片转换成JPG格式?
  18. WPF 3D 点光源学习
  19. SunEdison断崖之殇:光伏企业频频跳水的背后隐秘
  20. 成功人士每天早上的15个习惯

热门文章

  1. php分页技术的作用,分页原理技术细节剖析(php+mysql)实例
  2. python+OpenCV图像处理(一)读取、复制、显示、保存
  3. PyTorch框架学习六——图像预处理transforms(二)
  4. TensorFlow的基本介绍及Hello,world
  5. 组合数学基本工具-- 排列与组合以及简单公式
  6. Frida Android hook
  7. 安卓手机 Python 自动化测试
  8. 台湾计算机读研,台湾省计算机考研_会考教育名副其实
  9. Modbus协议栈应用实例之五:Modbus ASCII主站应用
  10. android音乐进度条设计代码,【Android】Android开发实现进度条效果,SeekBar的简单使用。音量,音乐播放进度,视频播放进度等...