c++顺序容器
最近在学习c++,做点笔记以便以后查看。
概述
容器顾名思义就是一些特定类型的对象集合,为程序员提供了控制元素和访问顺序的能力。这种顺序不依赖于元素的值。所有顺序容器都提供了快速顺序访问的能力
STL标准库,表列出以下方面的不同
- 向容器添加或从容器中删除元素的代价
- 非顺序访问容器元素的代价
| 容器类型 | 容器介绍 | 优缺点 |
|---|---|---|
| vector | 可变大小数组 | 支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢 |
| deque | 双端队列 | 支持快速随机访问在头尾位置插入/删除速度很快 |
| list | 双向链表 | 只支持双向顺序访问在list中任意位置进行插入/删除速度很快 |
| forward_list | 单向链表 | 在链表任意位置进行插入/删除速度很快 |
| array | 固定大小数组 | 支持快速随机访问。不能添加或删除元素 |
| string | 与vector类似的容器 | 专门用于保存字符。随机访问快。在尾部插入/删除速度快 |
使用方法
想要使用容器必须先导入相应的头文件。
#include <vector>
#include <list>
#include <deque>
共同方法
以下容器操作是所有容器类型都支持的
| 容器操作 | 操作说明 |
|---|---|
| 类型别名 | |
| iterator | 此容器类型的迭代器类型 |
| const_iterator | 可以读取元素,但不能修改元素的迭代器类型 |
| size_type | 无符号整数类型,足够保存此种容器类型最大可能容器的大小 |
| difference_type | 带符号整数类型,足够保存两个迭代器之间的距离 |
| value_type | 元素类型 |
| reference | 元素的左值类型;与value_type&含义相同 |
| const_reference | 元素的左值类型;与value_type&含义相同 |
| 构造函数 | |
| C c; | 默认构造函数,构造空容器 |
| C c1(c2); | 构造c2的拷贝c1 |
| C c1(b, e); | 构造c,将迭代器b和e指定的范围内的元素拷贝到c (arrary不支持) |
| C c{a, b, c…}; | 列表初始化c |
| 赋值与swap | |
| c1 = c2; | 将c1中元素替换为c2中的元素 |
| c1 ={a,b,c…}; | 将c1中元素替换为列表中的元素(不适用于array) |
| a = swap(b) | 交换a和b的元素 |
| swap(a,b) | 与a.swap(b)等价 |
| 大小 | |
| c.size() | c中元素的数目 (不支持forward_list) |
| c.max_size() | c可保存的最大元素的数目 |
| c.empty() | 判断c中是否存储了元素 |
| 添加/删除元素(不适用于array) | |
| c.insert(args) | 将args的元素拷贝进c |
| c.emplace(inits) | 适用inits构造c中的一个元素 |
| c.erase(args) | 删除args指定的元素 |
| c.clear | 删除c中的所有元素,返回void |
| 关系运算符 | |
| ==, != | 所有容器都支持相等(不等)运算符 |
| <, <=, > , >= | 关系运算符(无序关联容器不支持) |
| 获取迭代器 | |
| c.begin(),c.end() | 返回指向c的首元素和尾元素之后位置的迭代器 |
| c.cbegin(),c.cend() | 返回const_iterator |
| 反向容器的额外成员(不支持forward_list) | |
| reverse_iterator | 按逆序寻址元素的迭代器 |
| const_reverse_iterator | 不能修改元素的逆序迭代器 |
| c.rbegin(), c.rend() | 返回指向c的尾元素和首元素之前位置的迭代器 |
| c.crbegin(), c.crend() | 返回const_reverse_iterator |
用法实例
按照《c++ Primer》书中作者的介绍,我们在选取容器时基本上遵循以下基本原则:
- 除非你有很好的理由选择其他容器,否则应使用vector.
- 如果你的程序有很多小的元素,且空间的额外开销很重要,则不要使用list或forward_list.
- 如果程序要求随机访问元素,应使用vector或deque.
- 如果程序要求在容器的中间插入或删除元素,应使用lis或forward_list。
- 如果程序需要在头尾位置插入或删除元素,但不会在中间位置进行插入或删除操作,则使用deque.
- 如果程序只有在读取输入时才需要在容器中间位置插入元素,随后需要随机访问元素,则先将数据添加到vector中,在调用STL标准库的sort函数进行排序。如果必须在中间插入元素,考虑在输入阶段使用list,一旦输入完成,将list中的内容拷贝到一个vecctor中。
以下是vector容器的简单用法。
//1.初始化vector
vector<int> vec1;
vector<int> vec2(vec1);
vector<int> vec3(vec1.begin(),vec1.end());
vector<int> vec4(10);
vector<int> vec5(10,4);
//2.常用操作方法
vec1.push_back(100);//添加元素
int size = vec1.size();//元素个数
bool isEmpty = vec1.empty();//判断是否为空
cout << vec1[0] << endl;// 输出:100
vec1.insert(vec1.end(),5,3);//在vec1尾部中添加5个元素,每个添加的元素都是3
vec1.pop_back();//将最后一个元素移除
vec1.erase(vec1.begin(),vec1.end());
cout << (vec1 == vec2) ? true : false;
vector<int>::iterator iter = vec1.begin();
vec1.clear();
//3.遍历
int length = vec1.size();
for (int i = 0; i < length; i++) {
cout << vec1[i];
}
cout << endl << endl;
//迭代器
vector<int>::const_iterator iterator = vec1.begin();
for (; iterator != vec1.end(); iterator++) {
cout << *iterator;
}
本文围绕C++顺序容器展开,介绍其是特定类型对象集合,能控制元素和访问顺序。阐述使用需导入头文件及共同方法,还给出选取容器的基本原则,如优先用vector,根据不同操作需求选择合适容器,并给出vector简单用法示例。
1066

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



