vector学习笔记

vector
这篇文章之所以会出现是因为博主太菜了,并不会vector
概述
vector是一个十分神似数组的东西,同时又混合了队列的操作,又新增了许多神奇的功能,使他成为了我个人认为的最难的数据类型。当然,这只是因为我没学过

总的来说,他有一个神奇的特点:他是可以动态扩容的,即可以避免很大一部分的数组超限。当然,有好处必然有坏处——他每次扩容都是成倍的扩容(把原本的内容复制到新的空间,并在后面继续添加新数),因此其实是很耗空间的,因此在一般做题时,除非用别的数据结构做麻烦,不然最好别用

构造(定义)

// 1. 创建空vector; 常数复杂度
vector<int> v0;
// 1+. 这句代码可以使得向vector中插入前3个元素时,保证常数时间复杂度 v0.reserve(3);
// 2. 创建一个初始空间为3的vector,其元素的默认值是0; 线性复杂度 vector<int> v1(3); // 3. 创建一个初始空间为3的vector,其元素的默认值是2; 线性复杂度 vector<int> v2(3, 2); // 4. 创建一个初始空间为3的vector,其元素的默认值是1, // 并且使用v2的空间配置器; 线性复杂度 vector<int> v3(3, 1, v2.get_allocator()); // 5. 创建一个v2的拷贝vector v4, 其内容元素和v2一样; 线性复杂度 vector<int> v4(v2); // 6. 创建一个v4的拷贝vector v5,其内容是{v4[1], v4[2]}; 线性复杂度 vector<int> v5(v4.begin() + 1, v4.begin() + 3); // 7. 移动v2到新创建的vector v6,不发生拷贝; 常数复杂度; 需要 C++11 vector<int> v6(std::move(v2)); // 或者 v6 = std::move(v2);

正常情况下,以上的操作大概够用

访问

v.at(pos) //返回容器中下标为 pos 的值。
v[pos] //返回容器中下标为 pos 的引用。不执行越界检查
v.front() //返回首元素
v.back() //返回末尾元素
v.data() //返回指向数组第一个元素

迭代器
我太菜了,暂时用不着,~~也并不会~~
增删及修改

clear() //清除所有元素
insert() //支持在某个迭代器位置插入元素、可以插入多个。复杂度与 pos 距离末尾长度成线性而非常数的
erase() //删除某个迭代器或者区间的元素,返回最后被删除的迭代器。复杂度与 insert 一致
push_back() //在末尾插入一个元素,均摊复杂度为 常数,最坏为线性复杂度
pop_back() //删除末尾元素,常数复杂度
swap() //与另一个容器进行交换,此操作是 常数复杂度 而非线性的

其他
基本上队列的操作他也都可以,例:empty()

 

上一篇:Airtest API精讲之swipe()


下一篇:黑马:常用集合算法(261~263)