vector

概念

内存连续,可变数组
封装了一个动态大小数组顺序容器,vector<int> ans '[]' , '*' 等运算符都是通过重载运算符来实现的

创建

// 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
// v2没有了长度为零
vector<int> v6(std::move(v2));  // 或者 v6 = std::move(v2);

常用方法

  • at() 类似string
    如果数组越界,抛出std::out_of_ range

  • operator[]
    v[pos]返回容器pos的引用,不执行越界检查。

  • front()

    v.front() 返回首元素的引用。
    与v[0],v.at(o)差不多

  • back()

    v.back() 返回末尾元素的引用。
    和v[v.size() - 1]差不多

  • data()

    v.data() 返回指向数组第一个元素的指针。

迭代器

  • begin()/cbegin()

    返回指向首元素的迭代器,其中 *begin = front。

  • end()/cend()

返回指向数组尾端占位符的迭代器,注意是没有元素的。

  • rbegin()/crbegin()

    返回指向逆向数组的首元素的逆向迭代器,可以理解为正向容器的末元素。

  • rend()/crend()

    返回指向逆向数组末元素后一位置的迭代器,对应容器首的前一个位置,没有元素。

长度和容量

  • empty() 返回一个 bool 值,即 v.begin() == v.end(),true 为空,false 为非空。

  • size() 返回容器长度(元素数量),即 std::distance(v.begin(), v.end())。

  • resize() 改变 vector 的长度,多退少补。补充元素可以由参数指定。

  • max_size() 返回容器的最大可能长度。

与容量相关:

  • reserve() 使得 vector 预留一定的内存空间,避免不必要的内存拷贝。 //reserve主要就是设置capacity

  • capacity() 返回容器的容量,即不发生拷贝的情况下容器的长度上限。

  • shrink_to_fit() 使得 vector 的容量与长度一致,多退但不会少。

capacity与size的比较

机场

....

https://oi-wiki.org/lang/csl/sequence-container/

posted @ 2023-03-06 11:08  壹剑霜寒十四州  阅读(14)  评论(0编辑  收藏  举报