8、泛型程序设计与c++标准模板库2、c++标准模板库中的容器
顺序容器类以逻辑线性排列方式存储元素,在这些容器类型中的元素在逻辑上被认为是连续的存储空间中存储的。顺序容器可用于存储线性群体。
在关联容器类中,元素的存储和检索基于关键字和元素与其他元素之间的关系,与顺序容器类的元素存储和检索方式完全不同。
对顺序容器的访问分为顺序或直接(也称随机)两种。
容器类库中向量和队列提供直接访问,而列表提供连续访问。
还有4种类型的关联容器:集合容器、多重集合容器、映射容器和多重映射容器。关联容器具有从基于链的集合中快速提取对象的能力。集合的大小可在运行时改变。
在STL中为了使用集合容器和多重集合容器,必须包含头文件<set>;为了使用映射容器和多重映射容器,必须包含头文件<map>;
标准模板库支持7种容器,他们提供了对元素的基本的存储、检索和访问功能。
1)顺序容器
c++的基本算法本身已经提供了一个顺序容器,就是数组,但数组不是面向对象的。STL提供了向量、列表和双端队列3个顺序容器。
向量容器的数据安排即操作方式与数组非常相似,但向量容器是动态的,随着元素的加入,它会根据需要自动扩充空间以容纳新的元素。
列表容器与向量容器相比更复杂些,它的优势是每次插入或删除一个元素,就分配或释放一个元素的空间,因此列表容器对空间的利用是充分有效的。
双端队列则是可以在两端分别作元素的插入和删除操作的数据结构,STL提供了双端队列容器。
下面是顺序容器的共性部分:
1)顺序容器的接口
除了所有容器公用的运算符和方法外,顺序容器还拥有一个插入和删除方法集,由于这些方法改变容器的 状态,所以称为修改方法。
每个顺序容器至少有3个插入修改方法和3个删除修改方法。
a、插入方法
所有的容器都必须提供一些方法来把元素添加到容器中。这个工作可以通过构造函数来完成,或者使用插入成员函数。所有顺序容器提供了3种基本的插入成员函数类型。
第一种是push_front()和push_back(),这两个函数把一个元素加入到容器的首部或尾部。
第二种是insert()函数。这个函数在每个顺序容器类都有多个版本。在把元素插入容器时,要调用拷贝构造函数。insert()方法不会使列表容器中的迭代器无效,但可以使向量和双端队列容器中的迭代器无效,它会导致双端队列和向量内部的重定位。如果发生了重定位,则容器中的元素都要移动。如果迭代器在重定位和元素移动之前是指向元素的,那么这些迭代器便不再有效。
第三种方法是通过使用赋值运算符向容器中添加元素,可以把一个容器赋值到另一个空容器。
调用push_front()、push_back()、insert()成员函数,使用运算符"="与调用带参数的构造函数是用户向顺序容器中添加元素的标准方法。
b、删除方法
所有顺序容器都提供从容器中已走元素的方法。要注意的是,当元素从容器中移走时,调用的是容器中元素的析构函数而不是容器的析构函数。容器离开作用域或者进行删除操作时调用容器的析构函数。
每个顺序容器都有以下基本的删除方式:pop()函数或函数组、erase()函数、clear()函数、析构函数。
pop()函数有两种:pop_front()函数从容器的首部移走元素,而pop_back()函数从容器尾部移走元素。
erase(L)方法移走由L指向的元素,而erase(L1,L2)方法移走在L1和L2之间的元素。
clear()方法移走容器中的所有元素。
对每个删除方法,在每次从容器中移走元素时要调用析构函数。erase()方法返回被删除的最后一个元素之后的迭代器。如果在被删除的元素后面不再有元素则返回end()。
在列表容器中,erase()和clear()方法只会使移走的迭代器无效。而在向量和双端队列中情况更复杂些。如果元素是从双端队列的首部或尾部移走,只有被移走的元素的迭代器无效;如果元素是从双端队列的中部移走,所有迭代器都被认为无效;同样,如果从向量中移走元素,则所有的迭代器都无效。
c、顺序容器迭代访问方法
访问容器中元素的第三种方法是使用迭代器,这是一种面向对象的普通指针。对迭代器使用“*”运算符可以返回迭代器指向的元素。就像一个指针中包含一个地址或说是指向一个元素所在的内存一样,迭代器中包含一个位置或者说指向在给定容器中的一个元素。
指针是c++的内置类型,而迭代器是由容器类库或者用户定义的。也就是说,迭代器具有封装型、多态性和继承性。
d、其他顺序容器访问方法
访问顺序容器中的对象的3种基本方法。这些访问方法允许在不改变对象和容器的条件下访问容器。
对容器中元素的不修改访问
不修改访问方法 说明
front() 用来访问容器首部元素
back() 用来访问容器尾部元素
下标[]运算符 用来直接访问容器中任何一个元素
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】