STL容器
容器概述
容器(container)用于存放数据的类模板。可变长数组、链表、平衡二叉树等数据结构在 STL 中都被实现为容器。
使用容器时,即将容器类模板实例化为容器类时,会指明容器中存放的元素是什么类型的。
容器中可以存放基本类型的变量,也可以存放对象。对象或基本类型的变量被插入容器中时,实际插入的是对象或变量的一个复制品。
STL 中的许多算法(即函数模板),如排序、查找等算法,在执行过程中会对容器中的元素进行比较。这些算法在比较元素是否相等时通常用运算符进行,比较大小通常用\<运算符进行,因此,被放入容器的对象所属的类最好重载==和\<运算符,以使得两个对象用==和\<进行比较是有定义的。
容器的分类
容器主要分为:顺序容器、关联容器和容器适配器*。
- 顺序容器
顺序容器有以下三种:可变长动态数组 vector、双端队列 deque、双向链表 list。
它们之所以被称为顺序容器,是因为元素在容器中的位置同元素的值无关,即容器不是排序的。将元素插入容器时,指定在什么位置(尾部、头部或中间某处)插入,元素就会位于什么位置。
- 关联容器
关联容器有以下四种:set、multiset、map、multimap。关联容器内的元素是排序的。插入元素时,容器会按一定的排序规则将元素放到适当的位置上,因此插入元素时不能指定位置。
默认情况下,关联容器中的元素是从小到大排序(或按关键字从小到大排序)的,而且用\<运算符比较元素或关键字大小。因为是排好序的,所以关联容器在查找时具有非常好的性能。
- 容器适配器
除了以上两类容器外,STL 还在两类容器的基础上屏蔽一部分功能,突出或增加另一部分功能,实现了三种容器适配器:栈 stack、队列 queue、优先级队列 priority_queue。
容器都是类模板。它们实例化后就成为容器类。用容器类定义的对象称为容器对象。
例如,vector
任何两个容器对象,只要它们的类型相同,就可以用 \<、\<=、>、>=、==、!= 进行词典式的比较运算。假设 a、b 是两个类型相同的容器对象,这些运算符的运算规则如下。
- a == b:若 a 和 b 中的元素个数相同,且对应元素均相等,则a == b的值为 true,否则值为 false。元素是否相等是用==运算符进行判断的。
- a\<b:规则类似于词典中两个单词比较大小,从头到尾依次比较每个元素,如果发生 a 中的元素小于 b 中的元素的情况,则a\<b的值为 true;如果没有发生 b 中的元素小于 a 中的元素的情况,且 a 中的元素个数比 b 少,a\<b的值也为 true;其他情况下值为 false。元素比较大小是通过\<运算符进行的。
- a != b:等价于 !(a == b)
- a > b:等价于 b \< a
- a \<= b:等价于 !(b \< a)
- a >= b:等价于 !(a \< b)
容器的接口
所有容器都有以下两个成员函数:
int size():返回容器对象中元素的个数
bool empty():判断容器对象是否为空
顺序容器和关联容器都包含有以下成员函数:
begin():返回指向容器中第一个元素的迭代器
end():返回指向容器中最后一个元素后面的位置的迭代器
rbegin():返回指向容器中最后一个元素的反向迭代器
rend():返回指向容器中第一个元素前面的位置的反向迭代器
erase():从容器中删除一个或几个元素
clear():从容器中删除所有元素
顺序容器有如下常用成员函数:
front():返回容器中第一个元素的引用
back():返回容器中最后一个元素的引用
push_back():在容器末尾增加新元素
pop_back():删除容器末尾的元素
insert():插入一个或多个元素
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 yxhlfx@163.com
文章标题:STL容器
本文作者:红尘追风
发布时间:2016-09-24, 20:14:46
原始链接:http://www.micernel.com/2016/09/24/STL%E5%AE%B9%E5%99%A8/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。