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() 用来访问容器尾部元素
下标[]运算符 用来直接访问容器中任何一个元素
8、泛型程序设计与c++标准模板库2、c++标准模板库中的容器的更多相关文章
- 8、泛型程序设计与c++标准模板库1、泛型程序设计的概念和术语
有效地利用已有的成果,将经典的.优秀的算法标准化.模块化,从而提高软件的生产率,是软件产业化的需求,为了实现这一需求,不仅需要面向对象设计思想,而且需要泛型程序设计思想. c++语言提供的标准模板库( ...
- C++学习笔记53:泛型程序设计与C++标准模板库
泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++模板为泛型编程程序设计奠定了关键的基础 模型:符合一个概念的数据类型称为该概念的模型,例如: ...
- 8、泛型程序设计与c++标准模板库2.5容器适配器
容器适配器是用来扩展7中基本容器的,是修改和调整其他类接口的类.他们不提供存放数据的实际数据结构的实现方法,而且容器适配器也不支持迭代器. 1.标准栈容器 使用STL中的标准栈为程序员提供了一层附加的 ...
- 8、泛型程序设计与c++标准模板库3.迭代器
理解迭代器对于理解STL框架并掌握STL的使用至关重要.简单地说,迭代器是面向对象版本的指针,STL算法利用迭代器对存储在容器中的元素序列进行遍历,迭代器提供了访问容器和序列中每个元素的方法. 虽然指 ...
- C++ 泛型程序设计与STL模板库(1)---泛型程序设计简介及STL简介与结构
泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念 用来界定具备一定功能的数据类型.例如: 将 ...
- cb22a_c++_标准模板库_STL_map_multimap红黑树(数据结构)关联容器
cb22a_c++_标准模板库_STL_map_multimap红黑树(数据结构)关联容器map(映射,key不能重复,一对一对的,value_type(1, "one")),mu ...
- 从零开始学C++之模板(三):缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename
一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...
- 缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename
一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...
- C++ Primer笔记1_转义字符_标准库类型string_标准库类型vector
1.转义字符 一般有两种方式: \x后紧跟1个或多个十六进制数字.或\后紧跟1.2.3个八进制数字,当中数字部分是字符相应的数值. #include <iostream> using na ...
- Java核心技术卷一基础知识-第12章-泛型程序设计-读书笔记
第12章 泛型程序设计 本章内容: * 为什么要使用泛型程序设计 * 定义简单泛型类 * 泛型方法 * 类型变量的限定 * 泛型代码和虚拟机 * 约束与局限性 * 泛型类型的继承规则 * 通配符类型 ...
随机推荐
- 【leetcode刷题笔记】3Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- mini2440移植uboot 2014.04(三)
我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文档: s3c2440手册(下载地址) ...
- EntityFramework 学习 一 三种开发模式
Entity Framework支持3种不同的开发方法 1.Code First 2.Model First 3.Database First Code First 使用Code First开发模式, ...
- 大话设计模式--代理模式 proxy
1. 代理模式: 为其他对象提供一种代理以控制这个对象的访问. 代理模式使用场合: a. 远程代理, 为一个对象在不同的地址空间提供局部代理,隐藏一个对象存在于不同地址空间的事实.如.net中WebS ...
- request bs4
requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作, ...
- Linux下重命名文件或文件夹(mv命令与rename命令)
在Linux下重命名文件或目录,可以使用mv命令或rename命令 mv ———————————— mv命令既可以重命名,又可以移动文件或文件夹. 例子:将目录A重命名为B mv A B 例子:将/a ...
- Android学习路线01
part1:Java 1.Java基础 2.Java面向对象 3.数组与集合,异常,常用类 4.Io流 5.多线程socket编程 6.数据库,网络传输,数据解析 part2:Android 1.An ...
- freeMarker(十)——模板语言之内建函数
学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.字符串内建函数 这些内建函数作用于表达式左侧的字符串值. 如果左侧 ...
- 使用 py2exe 打包 Python 程序
上回在<使用 PyInstaller 打包 Python 程序>中,我们介绍了使用 PyInstaller 对 Python 程序进行打包,今天带大家认识一个新的工具:py2exe. 接下 ...
- 训练集、测试集loss容易出现的问题总结
train loss 不断下降,test loss不断下降:说明网络仍在学习; train loss 不断下降,test loss趋于不变:说明网络过拟合; train loss 趋于不变,test ...