(」・ω・)」うー!(/・ω・)/にゃー!
——潜行吧奈亚子

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()\)

posted @ 2021-12-25 22:16  GalaxyOier  阅读(49)  评论(0)    收藏  举报