切换C++刷leetcode时发现一些关于C++的基本操作都忘的差不多了,于是决定逐个记录下来。这篇事关于C++中vector操作的一些复习总结。

构造方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vector <T> v1;             // 空vector,执行默认初始化
vector <T> v2(v1); // v2包含v1中所有元素副本
vector <T> v2 = v1; // 等价于v2(v1)
vector <T> v3(n, val); // v3包含了n个重复的元素val
vector <T> v4(n); // 包含n个元素,若T为整型默认元素等于0,若为string默认为空
vector <T> v5{a, b, c...}; // 初始值个数等于序列中元素的个数,且每个元素被相应赋值
vector <T> v5 = {a, b, c...}; // 等价于v5{a, b, c...}
v.assign(7, 100); // 设置v包含7个值等于100的元素

// get_allocator

v1 = v2; // 用v2中元素的拷贝替换v1中的元素
v1 = {a, b, c...} // 用列表中元素的拷贝替换v1中的元素
v1 == v2;
v1 != v2;
<, <=, >, >= // 按照字典顺序进行比较

Element Access

1
2
3
4
5
v.at(i);   // 访问v中的第i个元素
v[n]; // 返回v中第n个元素
v.front(); // 返回v中的第一个元素
v.back(); // 返回v中的最后一个元素
v.data(); // 返回v在内存中的首地址

访问vector对象中元素

1
2
3
4
5
6
7
8
/* 把控制变量定义成引用类型就可以通过i给v的元素赋值 */
vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9};
for (auto &i : v) // 对于v中的每个元素
i *= i; // 求元素值的平方
for (auto i : v) // 对于v中的每个元素
cout << i << " "; // 输出该元素
cout << endl;
// 关键字 auto

Capacity

1
2
3
4
5
6
v.empty();         // v为空返回真;否则返回假
v.size(); // 返回v中元素的个数
v.max_size(); // 返回v最大可能容纳元素数
v.reserve(n); // 改变v的可容纳元素数为n,重新为v分配的空间
v.capacity(); // 返回当前v可容纳元素数,当前为v分配的空间
v.shrink_to_fit(); // 清除v中没有使用的空间

Modifiers

1
2
3
4
5
6
7
8
9
10
v.clear();       // 清除v中所有数据
v.pop_back(); // 清除v中最后一个数据
v.push_back(t); // 向v的尾端添加一个值为t的元素
v.resize(n); // 改变v中元素个数为n
v1.swap(v2); // 交换两个容器的内容

// v.insert(); // 数据插入,多个实现
// v.emplace();
// v.erase();
// v.emplace_back();

Iterators 操作

1
2
auto b = v.begin(), e = v.end(); // b和e的类型相同
// 待续

空间

关于STL容器,最令人称赞的特性之一就是…参考:STL Vector 常用操作整理,以及《C++ Primer》(第五版)9.4节《vector对象是如何增长的》。

参考

[1] http://www.cplusplus.com/reference/vector/vector/vector/

[2] https://en.cppreference.com/w/cpp/container/vector