C++ 参考手册

位置:首页 > C++ 参考手册 >容器库 > std::vector

    class T,
    class Allocator = std::allocator<T>

> class vector;
(1)
namespace pmr {

    template <class T>
    using vector = std::vector<T, std::pmr::polymorphic_allocator<T>>;

}
(2) (C++17 起)
1) std::vector 是封装动态数组的顺序容器。
2) std::pmr::vector 是使用多态分配器的模板别名。

元素相继存储,这意味着不仅可通过迭代器,还能用指向元素的常规指针访问元素。这意味着指向 vector 元素的指针能传递给任何期待指向数组元素的指针的函数。

(C++03 起)

vector 的存储是自动管理的,按需扩张收缩。 vector 通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。 vector 所用的方式不在每次插入元素时,而只在额外内存耗尽时重分配。分配的内存总量可用 capacity() 函数查询。额外内存可通过对 shrink_to_fit() 的调用返回给系统。 (C++11 起)

重分配通常是性能上有开销的操作。若元素数量已知,则 reserve() 函数可用于消除重分配。

vector 上的常见操作复杂度(效率)如下:

  • 随机访问——常数 O(1)
  • 在末尾插入或移除元素——均摊常数 O(1)
  • 插入或移除元素——与到 vector 结尾的距离成线性 O(n)

std::vector (对于 bool 以外的 T )满足容器 (Container) 具分配器容器 (AllocatorAwareContainer) 序列容器 (SequenceContainer) 连续容器 (ContiguousContainer) (C++17 起)可逆容器 (ReversibleContainer) 的要求。

模板参数

T - 元素的类型。
T 必须满足可复制赋值 (CopyAssignable) 可复制构造 (CopyConstructible) 的要求。 (C++11 前)
加诸元素的要求依赖于容器上进行的实际操作。泛言之,要求元素类型是完整类型并满足可擦除 (Erasable) 的要求,但许多成员函数附带了更严格的要求。 (C++11 起)
(C++17 前)
加诸元素的要求依赖于容器上进行的实际操作。泛言之,要求元素类型满足可擦除 (Erasable) 的要求,但许多成员函数附带了更严格的要求。若分配器满足分配器完整性要求,则容器(但非其成员)能以不完整元素类型实例化。 (C++17 起)

Allocator - 用于获取/释放内存及构造/析构内存中元素的分配器。类型必须满足分配器 (Allocator) 的要求。若 Allocator::value_typeT 不同则行为未定义。

特化

标准库提供 std::vector 对类型 bool 的特化,它可能为空间效率优化。

节省空间的动态 bitset
(类模板)

迭代器非法化

操作 非法化
所有只读操作 决不
swapstd::swap end()
clearoperator=assign 始终
reserveshrink_to_fit 若 vector 更改容量,则为其全部。否则为无。
erase 被擦除元素及之后的所有元素(包括 end() )。
push_backemplace_back 若 vector 更改容量,则为其全部。否则仅 end() 。
insert, emplace 若 vector 更改容量,则为其全部。否则仅为在或于插入点后者(包括 end() )。
resize 若 vector 更改容量,则为其全部。否则仅 end() 与被擦除元素。
pop_back 被擦除元素及 end()

成员类型

 
成员类型 定义
value_type T
allocator_type Allocator
size_type 无符号整数类型(通常是 std::size_t
difference_type 有符号整数类型(通常是 std::ptrdiff_t
reference
Allocator::reference (C++11 前)
value_type& (C++11 起)
const_reference
Allocator::const_reference (C++11 前)
const value_type& (C++11 起)
pointer
Allocator::pointer (C++11 前)
std::allocator_traits<Allocator>::pointer (C++11 起)
const_pointer
Allocator::const_pointer (C++11 前)
std::allocator_traits<Allocator>::const_pointer (C++11 起)
iterator 遗留随机访问迭代器 (LegacyRandomAccessIterator)
const_iterator 常随机访问迭代器
reverse_iterator std::reverse_iterator<iterator>
const_reverse_iterator std::reverse_iterator<const_iterator>

成员函数

构造 vector
(公开成员函数)
析构 vector
(公开成员函数)
赋值给容器
(公开成员函数)
将值赋给容器
(公开成员函数)
返回相关的分配器
(公开成员函数)
元素访问
访问指定的元素,同时进行越界检查
(公开成员函数)
访问指定的元素
(公开成员函数)
访问第一个元素
(公开成员函数)
访问最后一个元素
(公开成员函数)
返回指向内存中数组第一个元素的指针
(公开成员函数)
迭代器
返回指向容器第一个元素的迭代器
(公开成员函数)
返回指向容器尾端的迭代器
(公开成员函数)
返回指向容器最后元素的逆向迭代器
(公开成员函数)
返回指向前端的逆向迭代器
(公开成员函数)
容量
检查容器是否为空
(公开成员函数)
返回容纳的元素数
(公开成员函数)
返回可容纳的最大元素数
(公开成员函数)
预留存储空间
(公开成员函数)
返回当前存储空间能够容纳的元素数
(公开成员函数)
通过释放未使用的内存减少内存的使用
(公开成员函数)
修改器
清除内容
(公开成员函数)
插入元素
(公开成员函数)
(C++11)
原位构造元素
(公开成员函数)
擦除元素
(公开成员函数)
将元素添加到容器末尾
(公开成员函数)
在容器末尾就地构造元素
(公开成员函数)
移除末元素
(公开成员函数)
改变容器中可存储元素的个数
(公开成员函数)
交换内容
(公开成员函数)

非成员函数

(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20)
按照字典顺序比较 vector 中的值
(函数模板)
特化 std::swap 算法
(函数模板)
擦除所有满足特定判别标准的元素
(函数模板)

推导指引(C++17 起)

示例

#include <iostream>
#include <vector>
 
int main()
{
    // 创建含有整数的 vector
    std::vector<int> v = {7, 5, 16, 8};
 
    // 添加二个整数到 vector
    v.push_back(25);
    v.push_back(13);
 
    // 迭代并打印 vector 的值
    for(int n : v) {
        std::cout << n << '\n';
    }
}

输出:

7
5
16
8
25
13