STL容器操作总结

设计库的目的是为容器类型提供通用接口。如果两种容器提供相似的操作,则为它们定义的这个操作应该完全相同。例如,所有容器都有返回容器内元素个数的操作,于是所有容器都将操作命名为size,并将size返回值的类型都指定为size_type类型。类似地,算法具有一致的接口。例如,大部分算法都作用在由一对迭代器指定的元素范围上。

C++中的容器大致可以分为两个大类:

  • 顺序容器:将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素。主要有vector、list、deque(双端队列)。顺序容器包含顺序容器适配器:stackqueuepriority_queue

  • 关联容器:支持通过键来高效地查找和读取元素。主要有:pair、set、map、multiset和multimap。由于顺序容器,顺序容器适配器和关联容器在接口上存在较大的差异,因此分类进行总结。


一、顺序容器、map、set、multimap和multiset的通用操作

顺序容器、map、set、multimap和multiset 有很多相同的操作,因此放在这里一起说明,其他一些特有的容器操作将会在具体的容器部分介绍。c为容器对象

STL容器操作总结_第1张图片

容器元素类型必须满足以下两个约束:

  • 元素类型必须支持赋值运算;
  • 元素类型的对象必须可以复制。

关系运算符依据下面的规则而定义:

(1)两个容器必须有相同的类型;

(2)两个容器相等是指它们包含的元素对应相等并且次序一致;

(3)比较一个容器小于另一个容器,要按照词典比较法进行。

赋值操作

把一个容器赋值给另一个容器,首先要删除原有的元素,然后再把源容器中的所有元素复制到目标容器。所以说容器的赋值操作对性能的代价是相当的昂贵的。如果两个容器类型相同,而且源容器不在使用,那么有一个更加优化的方法:swap(),它的执行效率将大大高于普通的容器赋值操作。

算术运算符

迭代器的算术运算返回的迭代器,指向容器中的元素位置或 容器的end()位置。

关系运算符

当两个迭代器指向同一个容器中的同一个元素,或者当它们都指向同一个容器的end()位置时,两个迭代器相等。

常用迭代器运算

STL容器操作总结_第2张图片


二、顺序容器操作

除(一)中通用的操作外,顺序容器还有以下常用操作:

顺序容器定义和初始化

STL容器操作总结_第3张图片

添加和删除元素

STL容器操作总结_第4张图片

容器大小


访问元素

STL容器操作总结_第5张图片

赋值



三、容器适配器操作

所有适配器都定义了两个构造函数:默认构造函数用于创建空对象,而带一个容器参数的构造函数将参数容器的副本作为其基础值。默认的stackqueue都基于deque容器实现,而priority_queue则在vector容器上实现。

栈和队列的操作基本类似

STL容器操作总结_第6张图片


四、关联容器

关联容器(Associative containers)支持通过键来高效地查找和读取元素。两个基本的关联容器类型是map set。map的元素以键值(key-value)对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。

1.pair

STL容器操作总结_第7张图片

2.map

map是键-值对的集合。map类型通常可理解为关联数组:可使用键作为下标来获取一个值,正如内置数组类型一样。而关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置来获取。

map定义、初始化

STL容器操作总结_第8张图片

对map迭代器进行解引用时,将获得一个引用,指向容器中一个pair类型的值,该类型定义为value_type,且键为const。通过pair类型的访问方式可以对map进行进行访问。

对于map类型,唯一的约束就是必须支持 < 操作符,至于是否支持其他的关系或相等运算,则不作要求。

map类定义的类型

STL容器操作总结_第9张图片

添加元素

  • 下标操作:如果该键已在容器中,则 map 的下标运算返回该键所关联的值。只有在所查找的键不存在时,map 容器才为该键创建一个新的素,并将它插入到此 map 对象中。
  • insert 操作:除容器通用操作外,m.insert(e)epair类型的元素,如果em中不存在,则插入;否则e保持不变。

删除元素

除了通用操作利用迭代器删除元素以外,map还可以利用m.erase(k),删除m中键为k的元素。返回size_type类型的值,表示删除的元素个数。

查找元素

STL容器操作总结_第10张图片

3.set

set 容器的每个键都只能对应一个元素。以一段范围的元素初始化set对象,或在set对象中插入一组元素时,对于每个键,事实上都只添加了一个元素。

STL容器操作总结_第11张图片

获取元素

map相同,set也支持find(k)count(k)、lower_bound(k)和upper_bound(k)函数,来查找set中元素位置和个数。

set s;
for( int i = 0; i != 10; ++i )
s.insert(i);
s.find(1); //返回指向元素内容为1的迭代器
s.find(10); //不存在,反正s.end()
s.count(1); // 内容为1的元素个数,返回1
s.count(10); //返回0

4、multimap 和 multiset

multimap 和 multiset操作与map和set类似,它们还提供下面的操作:

STL容器操作总结_第12张图片

你可能感兴趣的:(C/C++)