c++容器基本使用方法
顺序性容器
| 类型 | 特性 |
|---|---|
vector |
可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢 |
deque |
双端队列。支持快速随机访问。在头尾位置插入或删除速度很快 |
list |
双向链表。只支持双向顺序访问。在任何位置插入或删除速度都很快 |
forward_list |
单向链表。只支持单向顺序访问。在任何位置插入或删除速度都很快 |
array |
固定大小数组。支持快速随机访问。不能添加或删除元素 |
string |
类似vector,但用于保存字符。支持快速随机访问。在尾部插入或删除速度很快 |
forward_list和array是C++11新增类型。与内置数组相比,array更安全易用。forward_list没有size操作。
容器选择原则:
- 除非有合适的理由选择其他容器,否则应该使用
vector。 - 如果程序有很多小的元素,且空间的额外开销很重要,则不要使用
list或forward_list。 - 如果程序要求随机访问容器元素,则应该使用
vector或deque。 - 如果程序需要在容器头尾位置插入/删除元素,但不会在中间位置操作,则应该使用
deque。 - 如果程序只有在读取输入时才需要在容器中间位置插入元素,之后需要随机访问元素。则:
- 先确定是否真的需要在容器中间位置插入元素。当处理输入数据时,可以先向
vector追加数据,再调用标准库的sort函数重排元素,从而避免在中间位置添加元素。 - 如果必须在中间位置插入元素,可以在输入阶段使用
list。输入完成后将list中的内容拷贝到vector中。
- 先确定是否真的需要在容器中间位置插入元素。当处理输入数据时,可以先向
- 不确定应该使用哪种容器时,可以先只使用
vector和list的公共操作:使用迭代器,不使用下标操作,避免随机访问。这样在必要时选择vector或list都很方便。
vector
可以理解vector是一个长度可变的数组。数组它在一创建之后就是确定好的大小,并且存放在静态空间,但是vector它内部空间大小可变动的。
1. 头文件
#include <vector>
2. 常用的API
构造函数
//1.默认构造,无参构造
vector<int> v1;
for (int i = 0; i < 10; ++i) {
v1.push_back(i);
}
// 2.利用区间方式构造
vector<int> v2(v1.begin(), v1.end());
赋值操作
//直接赋值
vector<int> v2;
v2 = v1;
//assign赋值
vector<int> v3;
v3.assign(v1.begin(), v1.end());
插入和删除
vector<int> v1;
//尾部插入
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);
// 尾部删除
v1.pop_back();
//在v1的头部插入-1元素
v1.insert(v1.begin(), -1);
//在v1的头部插入两个值为520的元素
v1.insert(v1.begin(), 2, 520);
//删除头部第一个元素
v1.erase(v1.begin());
//清空所有的元素
// 方法1
v1.erase(v1.begin(), v.end());
// 方法2
v1.clear();
容量和大小
size() 函数返回容器当前所包含的元素数量,而 capacity() 函数返回容器在不重新分配内存的情况下可以容纳的元素数量。
// 判断容器是否为空, 如果为空返回true,否则返回false
v1.empty();
// 获取容器的容量
v1.capacity();
// 获取容器的大小
//(注意!这里的容器的大小可以理解为里面存储的元素的个数)
v1.size();
// 修改容器的容量
v1.resize(100) // 扩容到可容纳100个元素
v1.resize(10, 100) //将向量 v1 调整为包含 10 个元素的大小,并用值为 100 的元素填充向量。
数据访问
// 下标访问(Subscript Access):使用下标操作符 [] 来访问指定位置的元素
vector<int> vec = {
1, 2, 3, 4, 5};
int value = vec[2]; // 获取索引为 2 的元素,即第三个元素,value 等于 3
//迭代器访问(Iterator Access):使用迭代器来遍历 vector 中的元素
for (auto it = vec.begin(); it != vec.end(); ++it) {
cout << *it << " "; // 输出每个元素的值
}
// 范围循环(Range-based Loop):使用 C++11 引入的范围循环来遍历 vector 中的元素。
for (int value : vec) {
cout << value << " "; // 输出每个元素的值
}
//at() 函数:使用 at() 函数来访问指定位置的元素,可以在访问越界时抛出 out_of_range 异常。
int value = vec.at(2); // 获取索引为 2 的元素,即第三个元素,value 等于 3
// front() 和 back() 函数:分别用于访问 vector 的第一个和最后一个元素
int first = vec.front(); // 获取第一个元素,即 1
int last = vec.back(); // 获取最后一个元素,即 5
deque
1.头文件
#include <deque>
2.常用API
构造函数
// 创建一个空的 deque 对象 d1
deque<int> d1;
d1.push_back(1);
d1.push_back(2);
d1.push_back(3);
// 使用 d1 的内容初始化另一个 deque d2,即 d2 包含了 d1 的所有元素
deque<int> d2(d1);
// 创建一个包含 10 个元素且每个元素的值都为 100 的 deque 对象 d3
deque<int> d3(10, 100);
deque<int> d4;
d4 = d3;

&spm=1001.2101.3001.5002&articleId=137738201&d=1&t=3&u=1ff66c2b36804340acd64ace408cce98)
3575

被折叠的 条评论
为什么被折叠?



