C++ Primer 学习笔记_34_STL实践与分析(8) --引言、pair类型、关联容器
STL实践与分析
--引言、pair类型、关联容器
引言:
关联容器与顺序容器的本质差别在于:关联容器通过键[key]来存储和读取元素,而顺序容器则通过元素在容器中的位置顺序的存取元素。
map的元素以键-值【key-value】对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的数据。
set仅包括一个键,并有效的支持关于某个键是否存在的查询。
|
关联容器类型 |
|
|---|---|
|
map |
关联数组:元素通过键来存取 |
|
Set |
大小可变的集合,支持通过键来实现的高速读取 |
|
multimap |
支持同一个键多次出现的map类型 |
|
multiset |
支持同一个键多次出现的set类型 |
一般来说,假设希望有效地存储不同值的集合,那么使用set容器比較合适,而map容器则更适用于须要存储(乃至改动)每一个键所关联的值的情况。
set和map类型的对象不同意为同一个键加入第二个元素。假设一个键必须相应多个实例,则需使用multimap或multiset,这两种类型同意多个元素拥有同样的键。
一、pair类型
pair类型在utility头文件里定义:
#include <utility>
|
pair类型提供的操作 |
|
|---|---|
|
pair<T1,T2>p1 |
创建一个空的pair对象,他的两个元素各自是T1和T2类型,採用值初始化 |
|
pair<T1,T2>p1(v1,v2) |
创建一个pair对象,它的两个元素各自是T1和T2,当中first成员初始化为v1,而second成员初始化为v2 |
|
make_pair(v1,v2) |
以v1和v2值创建一个新的pair对象,其元素类型分别为v1和v2的类型 |
|
p1< p2 |
两个pair对象之间的小于运算,其定义遵循字典次序:假设p1.first< |
|
p1== p2 |
假设两个pair对象的first和second成员依次相等,则这两个对象相等。该运算使用其元素的==操作符 |
|
p.first |
返回p中名为first的(公有)数据成员 |
|
p.second |
返回p的名为second的(公有)数据成员 |
1、pair的创建和初始化
在创建pair对象时,必须提供两个类型名:pair对象所包括的两个数据成员各自相应的类型名,这两个类型不必同样:
pair<string,string> anon;
pair<string,int> word_count;
pair<string,vector<int> > line;
能够在定义时为每一个成员提供初始化式:
pair<string,string> author("James","Joyce");
cout << "First: " << author.first << endl;
cout << "Second: " << author.second << endl;
能够利用typedef简化pair的声明:
typedef pair<string,string> Author;
Author proust("Marcel","Proust");
Author joyce("James","Joyce");
2、pair对象的操作
与其它标准库类型不同:对于pair类,能够直接訪问其数据成员,由于其数据成员都是公有的,分别命名为first和second:
typedef pair<string,string> Author;
Author author("James","Joyce"); string firstBook;
if (author.first == "James" && author.second == "Joyce")
{
firstBook = "Stephen Hero";
}
3、生成新的pair对象
出了构造函数,标准库还定义了make_pair函数,又传递给它的两个实參生成一个新的pair对象:
pair<string,string> next_auth;
string first,last;
while (cin >> first >> last)
{
next_auth = make_pair(first,last);
}
等价于:
//利用构造函数
next_auth = pair<string,string>(first,last);
因为pair的数据成员是公有的,所以能够直接的读取输入:
pair<string,string> next_auth;
while (cin >> next_auth.first >> next_auth.second)
{
//...
}
//P308 习题10.1
vector< pair<string,int> > paiVec; pair<string,int> paiVal;
while (cin >> paiVal.first >> paiVal.second)
{
paiVec.push_back(paiVal);
}
//习题10.2
//(1)
typedef pair<string,int> str_int;
vector< str_int > paiVec; str_int paiVal;
while (cin >> paiVal.first >> paiVal.second)
{
paiVec.push_back(paiVal);
}
//2
vector< pair<string,int> > paiVec;
string first;
int second; while (cin >> first >> second)
{
paiVec.push_back(make_pair(first,second));
}
//3
vector< pair<string,int> > paiVec;
string first;
int second; while (cin >> first >> second)
{
paiVec.push_back(pair<string,int>(first,second));
}
二、关联容器
1、关联容器共享大部分– 但并非全部的顺序容器的操作:关联容器不支持front、push_front、pop_front、back、pop_back操作。
2、顺序容器和关联容器公共的操作有一下几种:
1)表9.2描写叙述的前三种构造函数:
2)关联容器不能通过容器大小来定义,由于这种话就无法知道键所相应的值是什么。
3)第9.3.4节中描写叙述的关系运算。
4)表9.6列出的begin、end、rbegin和
rend操作。
5)表9.5列出的类型别名(typedef)。注意,对于map容器,value_type并不是元素的类型,而是描写叙述键及其关联值类型的pair类型。
6)表9.11中描写叙述的
swap和赋值操作。但关联容器不提供assign函数。
7)表9.10列出的
clear和
erase操作,但关联容器的erase运算返回
void类型。
8)表9.8列出的关于容器大小的操作。但resize函数不能用于关联容器。
3、依据键排列元素
除了上述列出的操作之外,关联容器还提供了其它的操作。而对于顺序容器也提供的同样操作,关联容器也又一次定义了这些操作的含义或返回类型,当中的区别在于关联容器中使用了键。
“容器元素依据键的次序排列”:在迭代关联容器时,我们能够确保依照键的顺序訪问元素,而与元素在容器中的位置全然无关!
C++ Primer 学习笔记_34_STL实践与分析(8) --引言、pair类型、关联容器的更多相关文章
- C++ Primer 学习笔记_32_STL实践与分析(6) --再谈string类型(下)
STL实践与分析 --再谈string类型(下) 四.string类型的查找操作 string类型提供了6种查找函数,每种函数以不同形式的find命名.这些操作所有返回string::size_typ ...
- C++ Primer 学习笔记_35_STL实践与分析(9)--map种类(在)
STL实践与分析 --map类型(上) 引: map是键-值对的集合. map类型通常能够理解为关联数组:能够通过使用键作为下标来获取一个值,正如内置数组类型一样:而关联的本质在于元素的值与某个特定的 ...
- C++ Primer 学习笔记_43_STL实践与分析(17)--再谈迭代器【中】
STL实践与分析 --再谈迭代器[中] 二.iostream迭代[续] 3.ostream_iterator对象和ostream_iterator对象的使用 能够使用ostream_iterator对 ...
- C++ Primer 学习笔记_46_STL实践与分析(20)--容器特有的算法
STL实践与分析 --容器特有的算法 与其它顺序容器所支持的操作相比,标准库为list容器定义了更精细的操作集合,使它不必仅仅依赖于泛型操作.当中非常大的一个原因就是list容器不是依照内存中的顺序进 ...
- C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】
STL实践与分析 --再谈迭代器[下] 三.反向迭代器[续:习题] //P355 习题11.19 int main() { vector<int> iVec; for (vector< ...
- C++ Primer 学习笔记_40_STL实践与分析(14)--概要、先来看看算法【上】
STL实践与分析 --概述.初窥算法[上] 标准库容器定义的操作很少.并没有给容器加入大量的功能函数.而是选择提供一组算法,这些算法大都不依赖特定的容器类型,是"泛型"的. ...
- C++ Primer 学习笔记_45_STL实践与分析(19)--建筑常规算法
STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用 ...
- C++ Primer 学习笔记_33_STL实践与分析(7) --容器适配器
STL实践与分析 --容器适配器 引: 除了顺序容器.标准库还提供了三种顺序容器适配器:queue,priority_queue和stack.适配器是标准库中的概念.包含容器适配器,迭代器适配器和函数 ...
- C++ Primer 学习笔记_41_STL实践与分析(15)--先来看看算法【下一个】
STL实践与分析 --初窥算法[下] 一.写容器元素的算法 一些算法写入元素值.在使用这些算法写元素时一定要当心.必须.写入输入序列的元素 写入到输入序列的算法本质上是安全的--仅仅会写入与指定输入范 ...
随机推荐
- 【前端vue开发架构】vue开发单页项目架构总结
为营销活动设计的前端架构 主要的技术栈为 Vuejs,Webpack,请自行阅读如下技术或者框架的文档: 一.基础说明: node (https://nodejs.org/en/) npm (http ...
- python面向对象(五)之多态
继承 在讲多态之前我们再复习下继承,下面是一个例子. Circle 和 Rectangle 继承自 Shape,不同的图形,面积(area)计算方式不同. # shape.py class S ...
- maxout激活函数
maxout的拟合能力是非常强的,它可以拟合任意的的凸函数.最直观的解释就是任意的凸函数都可以由分段线性函数以任意精度拟合(学过高等数学应该能明白),而maxout又是取k个隐隐含层节点的最大值,这些 ...
- ThinkPHP小知识点
ThinkPHP模版中时间戳转换为时间 {$vo.data|date='Y-m-d',###} thinkphp字符截取函数msubstr() ThinkPHP有一个内置字符截取函数mb_substr ...
- java 多线程总结篇3之——生命周期和线程同步
一.生命周期 线程的生命周期全在一张图中,理解此图是基本: 线程状态图 一.新建和就绪状态 当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时它和其他的Java对象一样,仅仅由Jav ...
- 超简单的java爬虫
最简单的爬虫,不需要设定代理服务器,不需要设定cookie,不需要http连接池,使用httpget方法,只是为了获取html代码... 好吧,满足这个要求的爬虫应该是最基本的爬虫了.当然这也是做复杂 ...
- PHP5.6中php-fpm的配置、启动、关闭和重启
转:http://blog.csdn.net/field_yang/article/details/52401994 该文主要讲述:如何配置PHP-fpm.常见报错解决方法和php-fpm的启动.关闭 ...
- 选择性卸载eclipse安装过的工具
我们有时候需要卸载eclipse中之前安装的一些工具,而不想全部删除,那就可以采取下面的方式: 打开eclipse,Help->About Eclipse->Installation De ...
- 001 Anaconda的介绍与安装
1.官网 www.continuum.io 2.ananconda的版本 同一个版本下对应一个python3与python2,在这里下载使用python 2.7的版本. 3.概述 Anaconda是一 ...
- 《Android源码设计模式》--模板方法模式
No1: 模板方法模式包括:抽象类(其中定义了一系列顺序方法).具体实现类A.具体实现类B 如果子类有实现不一样的细节,重写父类的某个方法即可 No2: AsyncTask对象调用execute方法后 ...