1

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();

zhanghao
15 声望1 粉丝

« 上一篇
C++ string 详解