vector¶
vector 是封装动态数组的序列容器,它可以方便地扩大或者缩小数组的大小,插入或删除元素(当然这意味着 vector 通常会占用多于静态数组的空间,因为要分配更多内存以管理将来的增长)
environment
下面的示例代码均在该代码框架下运行,若有特定的函数库会另外写出
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
// example code here;
return 0;
}
vector 的创建以及初始化¶
可以使用类似于数组的方式初始化 vector
vector<int> vec1 = {1, 2, 3, 4};
可以一次性初始化多个相同的元素
vector<int> vec2(5, 0); // {0, 0, 0, 0, 0}
可以通过另外一个 vector 来初始化
vector<int> vec3(vec2.begin(), vec2.end()); // {0, 0, 0, 0, 0}
vector<int> vec4(vec2); // {0, 0, 0, 0, 0}
可以通过迭代器的性质通过另外一个 vector 的部分内容来初始化
vector<int> vec5(vec2.begin(), vec2.begin() + 2); // {0, 0}
// 注意是左闭右开区间
元素访问¶
[]
& at
¶
你可以直接把 vector 的元素访问看作数组的访问,使用 []
操作符;当然,你也可以使用 at
函数
vector<string> vec = {"Nice", "to", "meet", "you"};
cout << vec[0] << endl; // "Nice"
cout << vec.at(0) << endl; // "Nice"
[] 和 at 的不同
对于 at
函数,如果访问到越界的下标会抛出 std::out_of_range
的错误;
而对于 []
操作符,如果访问到越界的下标是 未定义行为;
front
& back
¶
访问第一个元素可以使用 front
函数,访问最后一个元素可以使用 back
函数
vector<string> vec = {"Nice", "to", "meet", "you"};
cout << vec.front() << endl; // "Nice"
cout << vec.back() << endl; // "you"
迭代器¶
vector 有 begin
, end
, rbegin
, rend
等迭代器;其中 begin
是指向第一个元素的迭代器,而 end
是指向最后一个元素的 后一个元素 迭代器
# include <algorithm>
vector<string> vec = {1, 2, 3, 4, 5};
// 求和
int sum = accumulate(vec.begin(), vec.end(), 0);
cout << sum << endl; // 15
// 打印 vec
for_each(vec.begin(), vec.end(), [](const int num) {
cout << num << '-';
});
// 1-2-3-4-5-
而 rbegin
是指向逆向的 vector 的首元素的逆向迭代器,即对应 vector 最后一个元素;rend
是指向逆向的 vector 的末元素后一元素的逆向迭代器,即对应 vector 首元素的 前一元素;
vector<string> vec = {1, 2, 3, 4, 5};
// 反向打印 vec
for_each(vec.rbegin(), vec.rend(), [](const int num) {
cout << num << '-';
});
// 5-4-3-2-1-
属性查询函数¶
empty
¶
返回 vector 是否为空
vector<int> vec;
cout << vec.empty() << endl; // true
vec.push_back(13);
cout << vec.empty() << endl; // false
size
¶
返回 vector 中的元素个数
vector<int> vec;
cout << vec.size() << endl; // 0
vec.push_back(13);
cout << vec.size() << endl; // 1
修改函数¶
push_back
¶
在 vector 末尾插入新的元素
vector<int> vec(3, 0); // {0, 0, 0}
vec.push_back(1); // {0, 0, 0, 1}
vec.push_back(2); // {0, 0, 0, 1, 2}
emplace_back
¶
在 vector 末尾插入新的元素
vector<int> vec(3, 0); // {0, 0, 0}
vec.emplace_back(1); // {0, 0, 0, 1}
vec.emplace_back(2); // {0, 0, 0, 1, 2}
Tip
emplace_back
在 C++11 添加,相较于 push_back
效率上有一定提升;emplace_back
最大的作用是避免产生不必要的临时变量;详情参考 https://zh.cppreference.com/w/cpp/container/vector/emplace_back
insert
¶
- 使用
vector.insert(iterator pos, value, cnt)
可以在pos
迭代器前对应位置插入对应value
- 使用
vector.insert(iterator pos, value, cnt)
可以在pos
迭代器前对应位置插入cnt
个对应value
- 使用
vector.insert(iterator pos, iterator left, iterator right)
可以在pos
迭代器前对应位置插入[left, right)
迭代器区间的值;注意是左闭右开区间
vector<int> vec(3, 0); // {0, 0, 0}
vec.insert(vec.begin(), 1); // {1, 0, 0, 0}
vec.insert(vec.end(), 2, 2); // {1, 0, 0, 0, 2, 2}
vector<int> temp(3, 3); // {3, 3, 3}
vec.insert(vec.begin(), temp.begin(), temp.end()); // {3, 3, 3, 1, 0, 0, 0, 2, 2}
pop_back
¶
移除 vector 的末尾元素
vector<int> vec = {0, 1, 2, 3};
vec.pop_back(); // {0, 1, 2}
vec.pop_back(); // {0, 1}
clear
¶
清空 vector 中的所有元素
vector<int> vec = {1, 2, 3};
cout << vec.size() << endl; // 3
vec.clear();
cout << vec.size() << endl; // 0
erase
¶
- 使用
vector.erase(iterator pos)
可以通过指定对应位置的迭代器删除对应元素 - 使用
vector.erase(iterator left, iterator right)
可以通过指定对应范围[left, right)
的迭代器删除对应元素;注意是 左闭右开 区间
vector<string> vec = {"Nice", "to", "meet", "you"};
vec.erase(vec.begin() + 2, vec.end()); // {"Nice", "to"}
vec.erase(vec.begin()); // {"to"}