C++基本的容器(STL)

本文详细介绍了C++标准模板库(STL)中的容器概念,包括顺序容器、关联容器和容器适配器的特性及使用方法。探讨了STL如何实现数据结构与算法的分离,以及各种容器的底层实现和成员函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

STL (C++容器)是一些常用数据结构(如链表、可变长数组、排序二叉树)和算法(如排序、查找)的模板的集合。STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。例如,vector 的底层为顺序表(数组),list 的底层为双向链表,deque 的底层为循环队列,set 的底层为红黑树,hash_set 的底层为哈希表。

容器其实是类模板。它们实例化后就成为容器类(实例化时要指定容器元素的类型),用容器类定义的对象称为容器对象。
当插入元素时,是把元素复制了一份再插入
被放入容器的对象所属的类最好重载 < 和 == 比较运算符

容器的分类

  1. 顺序容器:元素在容器中不是排序的,元素的位置与元素的值无关。比如:动态数组 vector、双端队列 deque、双向链表 list
  2. 关联容器:元素在容器中时排好序的(默认是从小到大),插入时不能指定位置。比如:set、multiset、map、multimap
  • 将容器一部分功能屏蔽,并增加另一部分功能即构成容器适配器 stack,queue,priority_queue。

容器的类型一样就可以进行 < <= > >= != == 比较运算符的比较
例如:
a<b:规则类似于词典中两个单词比较大小,从头到尾依次比较每个元素,如果发生 a 中的元素小于 b 中的元素的情况,则a<b的值为 true;如果没有发生 b 中的元素小于 a 中的元素的情况,且 a 中的元素个数比 b 少,a<b的值也为 true;其他情况下值为 false。元素比较大小是通过<运算符进行的。

成员函数

容器的成员函数一般有
int size():返回容器对象中元素的个数。
bool empty():判断容器对象是否为空。
顺序容器和关联容器还有以下成员函数:
begin():返回指向容器中第一个元素的迭代器。
end():返回指向容器中最后一个元素后面的位置的迭代器。
rbegin():返回指向容器中最后一个元素的反向迭代器。
rend():返回指向容器中第一个元素前面的位置的反向迭代器。
erase(...):从容器中删除一个或几个元素。
clear():从容器中删除所有元素。

如果一个容器是空的,则 begin() 和 end() 的返回值相等,rbegin() 和 rend() 的返回值也相等。

顺序容器
front():返回容器中第一个元素的引用。
back():返回容器中最后一个元素的引用。
push_back():在容器末尾增加新元素。
pop_back():删除容器末尾的元素。
insert(...):插入一个或多个元素。
关联容器

因为关联容器在内部是排好序的,所以在插入时不能指定插入位置。并且不能修改set的元素的值,不能修改map元素键的值,修改之后容器不会自动调整顺序,有序性会被破坏,这时再查找就会得到错误的结果。

关联容器内部比较大小是用 < 运算符。

特有的成员函数如下

find:查找某个值。
lower_bound:查找某个下界。
upper_bound:查找某个上界。
equal_range:同时查找上界和下界。
count:计算等于某个值的元素个数。
insert:插人一个元素或一个区间。
容器适配器

容器适配器有 stack queue priority_queue三种,都是在顺序容器的基础上屏蔽了一些功能,突出或增加了另外一些功能。
特有的成员函数:

push:添加一个元素。
top:返回顶部(对 stack 而言)或队头(对 queue、priority_queue 而言)的元素的引用。
pop:删除顶部(对 stack 而言)或队尾(对 queue、priority_queue 而言)的元素

另外容器适配器是没有迭代器的,STL中的很多排序、查找、变序算法都不能用

其实stl算法也是函数模板,大多数都在 algorithm这个头文件中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值