STL vector 小结
简介
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 的内存
注意点
- 初始化 vector 时最好指定一个初始大小,或者调用 reserve 指定初始容量,否则会导致 vector 频繁扩容,降低效率
- 对 vector 的操作最好集中在尾部,否则会导致 vector 内部元素移动,降低效率
- 可以通过 swap 函数间接释放空间利用率不高的 vector 的内存