C++ 10.1和10.2 关联容器-----pair 类型

参考:《10.1,10.2关联容器—-三种构造函数》
http://blog.csdn.net/hlsdbd1990/article/details/46438003

参考:《 4.1 数组 —-显示的初始化》
http://blog.csdn.net/hlsdbd1990/article/details/45561403

参考:《 12.4.5 类成员的显示初始化》
http://write.blog.csdn.net/mdeditor#!postId=46605673

简介

  • 使用关联容器时,都必须要包含头文件,分别是 # include< map > 和 # include< set >

  • 关联容器与顺序容器的本质区别在于:关联容器通过键(key)存储和读取元素,而顺序容器则是通过元素在容器中的位置顺序存储和访问元素。

  • 了解一种与关联容器相关的简单的标准库类型—-pair 类型,该类型在utility 头文件中定义。 # include< utility >

=======================================================================================================

一、引言

  • 标准容器类型有的另一项内容—-关联容器。

    • 关联容器与顺序容器的本质区别在于:关联容器通过键(key)存储和读取元素,而顺序容器则是通过元素在容器中的位置顺序存储和访问元素。

    • 关联容器支持通过键来高效地查找和读取元素。

C++ 10.1和10.2 关联容器-----pair 类型_第1张图片
- 两个基本得关联容器类型是map和set .

  • map 的元素以键-值对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的数据.

  • set 仅包含一个键,并有效地支持关于某个键是否存在的查询。一般的,如果希望有效地存储不同值的集合,那么使用set 容器比较合适,而map 容器则更适用于需要存储(乃至修改)每个键所关联的值的情况。在做某种文本处理时,可使用set保存要忽略的单词。而字典则是map的一种很好的应用:单词本身是键,解释说明是值。

  • set 和 map 类型的对象所包含的元素都具有不同的键,不允许为同一个键添加第二个元素。如果一个键对应多个实例,则需使用multimap或multiset类型,这两种类型允许多个元素拥有相同的键。

  • 使用关联容器时,都必须要包含头文件,分别是 # include< map > 和 # include< set >

二、pair类型——# include< utility >

  • 了解一种与关联容器相关的简单的标准库类型—-pair 类型,该类型在utility 头文件中定义。

include< utility >

C++ 10.1和10.2 关联容器-----pair 类型_第2张图片

1. pair 的创建和初始化

  • pair 包含两个数据值,与容器一样,pair 也是一种模板类型,但与顺序容器区别之处在于,在创建pair对象时,必须提供两个类型名:pair 对象所包含的两个数据成员各自对应的类型名字,这两个类型不必相同。
vector<int> ivec;//定义一个vector容器
pair<string,string> anon;//有两个string类型
pair<string,int> word_count;//一个string,一个int
pair<string,vector<int> > line;
  • 如果创建pair对象时不提供初始化式,则调用默认构造函数对其成员采用值初始化。于是anon是包含两个空string类型成员的pair对象。line 则是存储一个空string类型对象,一个空的vector类型对象。word_count中的int型成员获得0值
//也可以在定义时提供初始化式

pair<string,string> author("james","joyce");//定义一个pair类型的对象,名为author,有两个string成员,分别初始化为字符串“james”和“joyce”
//可以通过typedef 简化其声明
typedef pair<string,string> Author;
Author proust("wewew","wewe");
Author joyce("wewew","wewe");

2.pair 对象的操作—first成员和second成员

  • 与其他标准库类型不同,对于pair类,可以直接访问其数据成员:其成员都是公有的,分别命名为 first 和 second。只需使用普通的点操作符—–成员访问标识即可访问其成员:
string firstBook;
if(author.first=="james"&&author.second=="joyce")
   firstBook ="Stephen Hero";

3、生成新的pair对象—make_pair函数

  • 除了构造函数,标准库还定义了make_pair函数,由传递给它的两个实参生成一个新的pair对象。
pair<string,string> next_auth;
string first,last;
while(cin>>first>>last)//通过标准输入,给string对象初始化
{    
     next_auth = make_pair(first,last);
}
next_auth = pair<string,string>(first,last);
pair<string,string> next_auth;
while(cin>>next_auth.first>>next_auth.second){

}
//习题 10.1
#include <iostream>
#include<list>
#include<vector>
#include<string>
#include<cstring>
#include<utility>//头文件包含,使用其中的pair类型
using namespace std;
int main()
{
string  str;
int ival;
pair<string,int>  sipr;
vector<pair<string,int> > pvec; //两个 > 符号之间要有空格,不然系统会认为是>>操作符
while(cin>>str>>iter){
exam=make_pair(str,iter);
pvec.push_back(exam);
}
    return 0;
}
//习题 10.2

//方法一:习题10.1 
//方法二:采用直接访问数据成员的方法生成pair对象
int main(){
   string  str;
int ival;
pair<string,int>  sipr;
vector< pair<string,int> > pvec;
while(cin>>str>>ival){
   sipr.first=str;
   sipr.second=ival;
   pvec.push_back(sipr); 
}
return 0;
}
//方法三:采用提供初始化式的方法创建pair对象
int main(){
string str;
int ival;
vector<pair<string,int> > pvec;
while(cin>>str>>ival){
  pair<string,int> sipr(str,ival);
  pvec.push_back(sipr);
}  
return 0;
}
//12.4.5 节 类成员的显示初始化

pair<int,int>p2={0,42};
//因为pair类定义了构造函数,所以尽管其数据成员为public,也不能采用这种显示初始化方式。只有没有定义构造函数且全体数据成员为public的类,才可以采用与初始化数组元素相同的方式初始化其成员:
pair<int,int>p2(0,42);

//往下看

二、关联容器

1、关联容器提供的操作

  • 关联容器共享大部分——但并非全部的顺序容器的操作。

  • 关联容器不提供 front 、 push_front 、pop_front、back、push_back以及pop_back操作。

  • 三种构造函数

    • C< T> c;
    • C< T> c1(c2);
    • C< T> c(b,e);

(都是使用这三种构造函数初始化的,这三个构造函数也适用于顺序容器)

  • 关联容器不能通过容器大小来定义,因为这样就无法知道键所对应的值是什么
  • 支持 9.3.4 节中的关系运算
  • 表9-6中列出的begin、end、rbegin和end操作

  • (到时候查书本吧!!!!)

2、根据键排列元素

  • 容器元素根据键的次序排列——在迭代遍历关联容器时,我们可以确保键的顺序访问元素,而与元素在容器中的存放位置完全无关。

你可能感兴趣的:(关联容器,pair类型)