C++ STL 容器之 vector
vector 是 C++ 对数据结构动态数组的实现。要使用 vector,请在程序头添加:
#include <vector>
using name space std;
vector 对象的定义与初始化
vector<int> v; //定义一个空 vector 对象
vector<int> v(10); //定义一个具有 10 个元素的 vector 对象(int 型元素默认初始化为 0)
vector<int> v(3,5); //v = { 5, 5, 5 }
vector<int> v1(v); //v1 = v
vector<int> v = { 1, 2, 3 };
vector<int> v1 = v;
也可以使用一对迭代器来将 vector 初始化为由这对迭代器所指示的元素序列,此时不要求这两个容器的类型相同,甚至也不要求它们的元素类型相同,而只需要它们的元素类型可以相互转化即可。如:
set<char> s { 'a', 'b', 'c' };
vector<int> v (s.begin(), s.end()); // v = { 97, 98 , 99}
向 vector 对象添加元素
由于 vector 的实现机制,使得 vector 在尾端追加元素的平均用时较短,但在首部插入元素却很慢,故 vector 并不提供像 .push_front()
这样的成员函数。尽管如此,使用.insert()
还是可以实现在 vector 的首部插入元素,只不过这样很慢。因此,若需要在首部频繁插入元素,可以考虑使用 deque
使用 push_back 在 vector 尾部插入元素
vector<int> v = { 1, 2, 3 };
v.push_back(4); // v = { 1, 2, 3, 4 };
使用 insert 在 vector 任意位置插入元素
插入单个元素
vector<int> v = { 1, 2, 3 };
v.insert(dp.begin(), 4); // v = { 4, 1, 2, 3 };
插入一段元素
vector<int> v = { 1, 2 };
vector<int> v_1 = { 3, 4 };
v_1.insert(v_1.begin(), v.begin(), v.end()); // v = { 1, 2, 3, 4 };
在循环中插入元素
插入元素通常会使迭代器失效,这会给在循环中插入元素带来不小的麻烦。insert 操作在插入元素成功后会返回插入位置的有效迭代器。
vector<int> v = { 1, 2 };
vector<int> v_1 = { 3, 4 };
auto it = v_1.begin();
for (auto e:v)
auto it = v_1.insert(it, e);
// v_1 = { 2, 1, 3, 4 };
删除 vector 中的一个元素
使用 pop_back 删除 vector 尾元素
vector<int> v = { 1, 2, 3 };
v.pop_back(4); // v = { 1, 2 };
使用 erase 删除 vector 中任意位置的元素
删除一个元素
vector<int> v = { 1, 2, 3 };
v.erase(v.begin()); // v = { 2, 3 };
删除一段元素
vector<int> v = { 1, 2, 3, 4 };
v.erase(v.begin(), v.begin()+2); // v = { 3, 4 };
在循环中删除元素
删除元素通常会使迭代器失效,这会给在循环中删除元素带来不小的麻烦。erase 操作在插入元素成功后会返回插入位置的有效迭代器。
vector<int> v = { 1, 2, 3, 4 };
auto it = v.beign();
while (it!=v.end()) {
//删除值为奇数的元素,跳过值为偶数的元素
if (*it%2)
auto it = v.erase(it);
else
it++;
}
// v = { 2, 4 };
访问查找 vector 中的元素
使用下标访问
像数组一样,vector 支持下标随机访问
vector<int> v = { 1, 2, 3, 4 };
cout << v[1]; // 输出 2
使用迭代器进行访问
vector<int> v = { 1, 2, 3, 4 };
//将 v 中值为奇数的元素置为 0
for (auto it=v.begin(); it!=v.end(); it++) {
if (*it%2)
*it = 0;
}
// v = { 0, 2,0, 4};
使用 C++ 11 新特性访问
vector<int> v = { 1, 2, 3, 4 };
//将 v 中值为奇数的元素置为 0
for (auto n : v) {
if (n%2)
cout << n;
}
// 输出:1 3
注意:这种方式得到的 n 是 v 中元素的拷贝,若想要得到 v 元素的本身,请使用 &for (auto &n:v)
查找一个元素是否在 vector 中
vector 没有查找元素存在性的成员函数,请使用顺序容器的通用方法。
vector<int> v = { 1, 2, 3, 4 };
auto it_1 = find(v.begin(), v.end(), 1); // it_1 = v.begin();
autp it_2 = find(v.begin(), v.end(), 9); // it_2 = v.end();
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。