关于容器,《C++ primer》这样定义:一个容器就是一些特定类型对象的集合。
容器包含顺序容器和关联容器和容器适配器。这里主要讲顺序容器。
顺序容器为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖元素的值,而是与元素加入容器时的位置相对应。
顺序性容器是一种各元素之间有顺序关系的线性表,是一种 线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。这个位置和元素本身无关,而和操作的时间和地点有关, 顺序性容器不会根据元素的特点排序而是直接保存了元素操作时的逻辑顺序。比如我们一次性对一个顺序性容器追加三个元素,这三个元素在容器中的相对位置和追 加时的逻辑次序是一致的。
所有的容器都是类模板。要定义某种特殊的容器,必须在容器名后加一对尖括号,尖括号里面提供容器中存放的元素的类型; 所有容器类型都定义了默认构造函数,用于创建指定类型的空容器对象。默认构造函数不带参数。
标准库定义了三种顺序容器类型,它们都提供快速顺序访问元素的能力,差异只是在:向容器添加或从容器中删除元素的代价,以及当非顺序访问荣容器中元素的代价。下面是其相关比较
顺序容器 | 特点 |
vector | 可变大小数组,支持快速随机访问,在尾部外的位置插入或删除元素会慢 |
deque | 双端队列,支持快速随机访问。在头尾位置插入或删除都很快 |
list | 双向链表,只支持双向顺序访问,在链表任何位置插入或删除都很快 |
附:C++标准新增类型forward_list和array,其中array与内置数组相比,它是一种更安全、更容易使用的数组类型,与内置数组类似,它的数组大小是固定的,因此它不支持添加和删除操作以及改变容器大小的操作。forward_list没有size操作。
当需要用到容器时选择容器的一般原则如下:
1、无特殊要求,一般首选vector。
2、若程序包含多而小的元素,且对空间开销要求高,则避免使用list或forward_list。
3、若要随机访问,应使用vector或deque。
4、若需要中间执行插入或删除操作,则应使用list或forward_list。
5、若只需对头尾进行插入或山粗操作,则应使用deque。
之所以出现这些所谓的原则,其实还是源于开始时说的要根据实际需求,选择不同的性能折中的容器以求提升程序的综合性能。
5,顺序容器定义的几种类型:
容器操作
一、(类型别名)
size_type 无符号整数类型 容器大小
iterator 迭代器
reverse_iterator 逆序迭代器
const_iterator 只读迭代器
const_reverse_iterator 只读逆序迭代器
difference_type 迭代器的差值,可为负值
value_type 元素类型
reference 相当于 value_type&,即指向迭代器对应的元素
const_reference 相当于const value_type &
二、(容器大小操作)
a.size() 元素个数 c.max_size() 最大元素个数
a.empty() 指示a是否为空,为空返回true,否则返回false
a.resize(n,t) 重置c的大小为n,且 新增加的元素初始化为t。
a.max_size() a可保存的最大元素数目
三、(添加操作)
a.push_back(t) 在a末尾增加元素t
a.push_front(t) 在a前端增加元素t,只使用于list和deque
a.insert(p,t) 在迭代器p前面插入元素t,返回新元素的迭代器
a.insert(p,n,t) 在迭代器p前面插入n个元素t,返回void
a.insert(p,b,e) 在迭代器p前面插入迭代器b,e标记的范围内的元素,返回void
a.insert(p,k) k是一个花括号包围的元素值列表。将这些给定值插入到迭代器p指向元素之前,若为空,则返回p
四、(删除操作)
a.pop_back() 删除a的最后一个元素,返回void,如果a为空,则函数未定义
a.pop_front() 删除a的第一个元素,返回void;如果a为空,则函数未定义;只适用于list和deque
a.erase(p) 删除迭代器p指向的元素,返回下一个元素的迭代器;
a.erase(b,e) 删除迭代器b,e之间的元素,返回下一个元素的迭代器
a.clear() 删除a的所有元素,返回void
五、(获取迭代器)
a.begin()
a.end() 返回指向a的首元素和尾元素之后的位置的迭代器
a.front()
a.back() 指向reference
注意:a.back指向最后一个元素,a.end指向最后一个元素的下一位置
六、(赋值操作)
c1=c2
c1.swap(c2) c1 c2 互换
swap(c1,c2) 等价c1.swap(c2)
c.assign(b,e) 将迭代器b,e之间的元素复制给c
c.assign(n,t) 将c设置为n个值为t的元素