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;
}