命名空间
变体
操作

std::vector

来自 cppreference.cn
< cpp‎ | 容器
 
 
 
 
在头文件 <vector> 中定义
template<

    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元素的指针可以传递给任何期望指向数组元素的指针的函数。

vector的存储是自动管理的,并根据需要扩展。Vector通常比静态数组占用更多空间,因为分配了更多内存来处理未来的增长。这样,vector在每次插入元素时不需要重新分配,而只在额外内存耗尽时才需要。可以使用capacity()函数查询已分配内存的总量。通过调用shrink_to_fit()[1],可以将额外内存返回给系统。

重新分配通常是性能方面开销大的操作。reserve()函数可以在预先知道元素数量的情况下消除重新分配。

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

  • 随机访问 - 常数 𝓞(1)
  • 在末尾插入或移除元素 - 摊销常数 𝓞(1)
  • 插入或移除元素 - 与到vector末尾的距离呈线性关系 𝓞(n)

std::vector(对于bool以外的T)满足ContainerAllocatorAwareContainer(C++11起)SequenceContainerContiguousContainer(C++17起)ReversibleContainer的要求。

std::vector的所有成员函数都是constexpr:可以在常量表达式的求值中创建和使用std::vector对象。

然而,std::vector对象通常不能是constexpr,因为任何动态分配的存储都必须在同一常量表达式求值中释放。

(C++20 起)
  1. 在libstdc++中,shrink_to_fit()在C++98模式下不可用

目录

[编辑] 模板参数

T - 元素类型。
T必须满足CopyAssignableCopyConstructible的要求。 (C++11 前)
对元素的要求取决于容器上实际执行的操作。通常,要求元素类型是完整类型并满足Erasable的要求,但许多成员函数施加更严格的要求。 (C++11 起)
(C++17 前)

对元素的要求取决于容器上实际执行的操作。通常,要求元素类型满足Erasable的要求,但许多成员函数施加更严格的要求。如果分配器满足分配器完整性要求,则此容器(但不是其成员)可以用不完整元素类型实例化。

特性测试 标准 特性
__cpp_lib_incomplete_container_elements 201505L (C++17) 最小化不完整类型支持
(C++17 起)

[编辑]

Allocator - 用于获取/释放内存以及在该内存中构造/销毁元素的分配器。类型必须满足Allocator的要求。行为未定义(直到 C++20)程序格式错误(C++20起),如果Allocator::value_typeT不同。[编辑]

[编辑] 特化

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

节省空间的动态位集
(类模板特化) [编辑]

[编辑] 迭代器失效

操作 失效
所有只读操作 永不。
swap, std::swap end()
clear, operator=, assign 总是。
reserve, shrink_to_fit 如果vector改变了容量,所有迭代器都失效。否则,都不失效。
erase 被擦除的元素及其之后的所有元素(包括 end())。
push_back, emplace_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 value_type&[编辑]
const_reference const value_type&[编辑]
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

LegacyRandomAccessIteratorLegacyContiguousIteratorvalue_type

(C++20 前)

LegacyRandomAccessIteratorcontiguous_iteratorConstexprIteratorvalue_type

(C++20 起)
[编辑]
const_iterator

LegacyRandomAccessIteratorLegacyContiguousIteratorconst value_type

(C++20 前)

LegacyRandomAccessIteratorcontiguous_iteratorConstexprIteratorconst value_type

(C++20 起)
[编辑]
reverse_iterator std::reverse_iterator<iterator>[编辑]
const_reverse_iterator std::reverse_iterator<const_iterator>[编辑]

[编辑] 成员函数

构造 vector
(public member function) [编辑]
析构 vector
(public member function) [编辑]
将值赋给容器
(public member function) [编辑]
将值赋给容器
(public member function) [编辑]
将一个范围的值赋给容器
(public member function) [编辑]
返回关联的分配器
(public member function) [编辑]
元素访问
访问指定的元素,带边界检查
(public member function) [编辑]
访问指定的元素
(public member function) [编辑]
访问第一个元素
(public member function) [编辑]
访问最后一个元素
(public member function) [编辑]
直接访问底层连续存储
(public member function) [编辑]
迭代器
返回指向起始的迭代器
(public member function) [编辑]
(C++11)
返回指向末尾的迭代器
(public member function) [编辑]
返回指向起始的逆向迭代器
(public member function) [编辑]
(C++11)
返回指向末尾的逆向迭代器
(public member function) [编辑]
容量
检查容器是否为空
(public member function) [编辑]
返回元素数量
(public member function) [编辑]
返回元素的最大可能数量
(public member function) [编辑]
预留存储空间
(public member function) [编辑]
返回当前已分配存储空间中可容纳的元素数量
(public member function) [编辑]
通过释放未使用的内存来减少内存使用
(public member function) [编辑]
修改器
清除内容
(public member function) [编辑]
插入元素
(public member function) [编辑]
插入元素范围
(public member function) [编辑]
(C++11)
就地构造元素
(public member function) [编辑]
擦除元素
(public member function) [编辑]
添加元素到结尾
(public member function) [编辑]
就地构造元素于结尾
(public member function) [编辑]
添加一个元素范围到结尾
(public member function) [编辑]
移除末元素
(public member function) [编辑]
更改存储的元素数量
(public member function) [编辑]
交换内容
(public member function) [编辑]

[编辑] 非成员函数

(在 C++20 中移除)(在 C++20 中移除)(在 C++20 中移除)(在 C++20 中移除)(在 C++20 中移除)(C++20)
字典序比较两个 vector 的值
(函数模板) [编辑]
特化 std::swap 算法
(函数模板) [编辑]
擦除所有满足特定标准的元素
(函数模板) [编辑]

推导指引

(C++17 起)

[编辑] 注意

特性测试 标准 特性
__cpp_lib_containers_ranges 202202L (C++23) 容器的范围构造和插入

[编辑] 示例

#include <iostream>
#include <vector>
 
int main()
{
    // Create a vector containing integers
    std::vector<int> v = {8, 4, 5, 9};
 
    // Add two more integers to vector
    v.push_back(6);
    v.push_back(9);
 
    // Overwrite element at position 2
    v[2] = -1;
 
    // Print out the vector
    for (int n : v)
        std::cout << n << ' ';
    std::cout << '\n';
}

输出

8 4 -1 9 6 9

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
LWG 69 C++98 未要求 vector 元素存储的连续性 需要
LWG 230 C++98 T 不要求为可复制构造 (CopyConstructible)
(类型 T 的元素可能无法被构造)
T 也要求
可复制构造 (CopyConstructible)
LWG 464 C++98 访问空 vector 的底层存储导致未定义行为 提供了 data 函数

[编辑] 另请参阅

可变大小、固定容量、原地连续数组
(类模板) [编辑]
(C++11)
固定大小的原位连续数组
(类模板) [编辑]
双端队列
(类模板) [编辑]