欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STL vector 小结

程序员文章站 2022-07-12 22:51:14
...

简介

vector是一个动态数组,支持随机存取,不过只有在数组尾部插入时效率最高,应尽量避免在数组中间的操作。

API讲解

注:不列出空间配置器参数

成员函数

构造函数

vector()
构造一个空的vector

vector(size_type count)
构造一个初始 size 为 count 的 vector,所以会填充默认值

    vector<int> test(3);
    cout << test.size() << " " << test.capacity() << endl;
    test.push_back(4);
    cout << test.size() << " " << test.capacity() << endl;
    // 输出
    // 3 3
    // 4 6

vector(size_type count, const T& value = T())
构造一个初始size为count的vector,用 value 填充

    vector<int> test(3, 200);
    cout << test.size() << " " << test.capacity() << endl;
    for (const auto &x : test)
        cout << x << " ";
    // 输出
    // 3 3
    // 200 200 200

vector(InputIt first, InputIt last)
接收两个输入迭代器构造 vector,区间为左开右闭。

    int a[3] = {1, 2, 3};
    vector<int> b(a, a+3);
    for (const auto &x : b)
        cout << x << " ";
    cout << endl;
    vector<int> c(a, a+2);
    for (const auto &x : c)
        cout << x << " ";
    // 输出
    // 1 2 3 
	// 1 2 

vector(const vector &other)
拷贝构造

vector& operator=(const vector& other)
赋值构造

读取元素(引用)

函数:front()
返回第一个元素的引用

函数:back()
返回最后一个元素的引用

函数:at()
返回对应位置的元素的引用,若越界会抛出 std::out_of_range 异常

运算符:[]
返回对应位置的元素的引用

读取元素(迭代器)

函数:begin()
指向第一个元素,++操作向后移动

函数:end()
指向最后一个元素的后一个位置

函数:rbegin()
指向最后一个元素,++操作向前移动

函数:rend()
指向第一个元素的前一个位置

空间与容量操作

bool empty()
判断是否为空

size_type size()
返回 vector 的size的大小,即元素个数

resize(count[, value])
重置 vector 的 size。如果当前值大于 count,会删掉 count 及之后的值;如哦当前值小于 count, 会以 value 初始化到 vector 有 count 个值为止

size_type capacity()
返回 vector 的 capacity 大小,表示 vector 当前容量(插入一个元素时,如果容量有余,则直接插入,如果容量不足,则需要扩容)

void reserve( size_type new_cap );
手动设定 vector 的 capaciy,若要设置的值比 size 小,会失败
新建 vector 的时候,最好能直接调用此函数将 vector 扩容到一定大小,这样可以避免后续频繁扩容。此函数与 vector(count) 这种初始化的区别在于前者只改变 capacity,插入新元素会放在第一个;而后者会改变 size 和 capacity,插入元素会放在索引 count 处

shrink_to_fit()
减小 capacity 值与 size 相等。vector 元素被删除后空间并不会释放,即 capacity值不变,此函数可以实现vector 内存的回收

size_type max_size()
返回 vector 最大能达到的大小

    vector<int> test(3, 200);
    cout << test.max_size();
    // 4611686018427387903

修改操作

尾部插入:push_back(const T& value)
向 vector 尾部插入一个元素。这是 vector 插入元素最理想的方式,不会引起其它元素的移动

尾部移除:pop_back()
移除 vector 最后一个元素。同上,移除 vector 元素最理想的方式

插入函数:insert

  • iterator insert(iterator pos, const T& value)
    在 pos 位置前插入元素 value,返回指向新插入元素的迭代器
    vector<int> test(3, 200);
    auto iter = test.insert(test.begin()+2, 100);
    for (const auto &x : test)
        cout << x << " ";
    cout << endl;
    cout << *iter;
    // 200 200 100 200 
    // 100
  • insert(iterator pos, size_type count, const T& value)
    在 pos 位置前插入 count 个 值为 value 的元素。如果 count 不为零,返回指向第一个新插入元素的迭代器,如果 count 为零,则返回 pos

  • insert(iterator pos, InputIt first, InputIt last)
    在 pos 位置前插入 [first, last) 区间的元素。如果 first < last,返回指向第一个新插入元素的迭代器,如果 first == last ,则返回 pos

删除元素:erase

  • erase(iterator pos)
    删除 pos 位置的元素,返回指向删除元素的下一个元素的迭代器
  • erase(iterator first, iterator last)
    删除[first, last)区间的元素,返回指向最后一个删除元素的下一个元素的迭代器

清空元素:clear()
清空元素。只改变 size,不改变 capacity。

交换 vector:swap(vector& other)
交换两个 vector 的内容。可用于释放空间利用率不高的 vector 的内存

注意点

  1. 初始化 vector 时最好指定一个初始大小,或者调用 reserve 指定初始容量,否则会导致 vector 频繁扩容,降低效率
  2. 对 vector 的操作最好集中在尾部,否则会导致 vector 内部元素移动,降低效率
  3. 可以通过 swap 函数间接释放空间利用率不高的 vector 的内存

参考:cppreference.com

相关标签: STL vector