首页 > 代码库 > 【足迹C++primer】37、关联容器概述

【足迹C++primer】37、关联容器概述

关联容器概述
关联容器不支持顺序容器的位置操作,如push_back或push_front
也不支持构造函数或插入操作这些接受一个元素值和一个数量值的操作。

定义关联容器

这里注意哦,我这是一个函数,里面关联容器map是包含在头文件map中的!!!
还有就是set是包含在头文件set中的,string是包含在头文件string中的!!!

//关联容器初始化
void fun1()
{
    map<string, size_t> word_count;     //空容器
    //列表初始化
    set<string> exclude={"The","But","And","Or","An","A",
                         "the","but","and","or","an","a"};
    //三个元素,authors将姓映射为名
    map<string, string> authors={{"Joyce","James"},{"Austen","Jane"},{"Dickens","Charles"}};

}


对于set元素类型就是关键字类型。

初始化map时:{key , value}

初始化multimap或multiset

一个map或set中关键字是唯一的,对一个给定的关键字它对应的值就是唯一的大笑,唯一!!!我等屌丝的痛大哭
但是multimap和multiset就没有这个限制了,努力当一个multimap或multiset吧!!!

创建一个名为ivec的保存int的vector,它包含20个元素:0到9每个整数有两个拷贝。
我们将使用此vector初始化一个set和一个multiset

//初始化multimap或multiset
/*
创建一个名为ivec的保存int的vector,它包含20个元素:0到9每个整数有两个拷贝。
我们将使用此vector初始化一个set和一个multiset
*/
//定义一个有20个元素的vector,保存0到9每个整数的两个拷贝
void fun2()
{
    vector<int> ivec;
    for(vector<int>::size_type i=0 ; i != 10 ; ++i)
    {
        ivec.push_back(i);
        ivec.push_back(i);  //每个重复保存一次
    }

    //iset包含来自ivec的不重复的元素;miset包含所有20个元素
    set<int> iset(ivec.cbegin(), ivec.cend());
    multiset<int> miset(ivec.cbegin(), ivec.cend());

    cout<<ivec.size()<<endl;
    cout<<iset.size()<<endl;
    cout<<miset.size()<<endl;
}

关键字类型的要求

对于有序容器--map、multimap、set以及multiset,关键字类型必须定义元素比较方法

使用关键字类型的比较函数

自定义的操作类型必须在尖括号中紧跟着元素类型给出。

//关键字类型的要求
//使用关键字比较函数
void fun3()
{
    multiset<Sales_item, decltype(compareIsbn)*>
    bookstore(compareIsbn);
}

pair类型

这个其实就是一个数据类型一样,只是是一对数据!!!!
反正我现在的理解就是这样,有点感觉像map但是map可以存好多对,这玩意好像就只能存一对,
好吧,我算是有点明白了,map就相当于pair的数组,这样说估计就好理解多了!!!

pair定义在utility中。


//pair类型
//它定义在头文件utility中,一个pair保存两个数据成员。pair是一个用来生成特定
//类型的模板
void fun4()
{
    pair<string, string> anon;      //保存两个string
    pair<string, size_t> word_count;    //保存一个string和一个size_t
    pair<string, vector<int>> line;     //保存string和vector<int>
    //我们也可以为每个成员提供初始化器
    pair<string, string> author{"James","Joyce"};

}

//创建pair对象函数
pair<string, int>
process(vector<string> &v)
{
    //处理v
    if(!v.empty())
        return {v.back(), v.back().size()};     //列表初始化
    else
        return pair<string, int>();     //隐式构造返回值
}



全部奋斗成果:

尼玛电脑好卡啊!!!卡成狗了。。。我想要一台新电脑大哭

/**
* 功能:关联容器概述
* 时间:2014年6月25日08:21:03
* 作者:cutter_point
*/

/*

*/

#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<string>
#include"Sales_item.h"
#include<utility>

using namespace std;

//关联容器初始化
void fun1()
{
    map<string, size_t> word_count;     //空容器
    //列表初始化
    set<string> exclude={"The","But","And","Or","An","A",
                         "the","but","and","or","an","a"};
    //三个元素,authors将姓映射为名
    map<string, string> authors={{"Joyce","James"},{"Austen","Jane"},{"Dickens","Charles"}};

}

//初始化multimap或multiset
/*
创建一个名为ivec的保存int的vector,它包含20个元素:0到9每个整数有两个拷贝。
我们将使用此vector初始化一个set和一个multiset
*/
//定义一个有20个元素的vector,保存0到9每个整数的两个拷贝
void fun2()
{
    vector<int> ivec;
    for(vector<int>::size_type i=0 ; i != 10 ; ++i)
    {
        ivec.push_back(i);
        ivec.push_back(i);  //每个重复保存一次
    }

    //iset包含来自ivec的不重复的元素;miset包含所有20个元素
    set<int> iset(ivec.cbegin(), ivec.cend());
    multiset<int> miset(ivec.cbegin(), ivec.cend());

    cout<<ivec.size()<<endl;
    cout<<iset.size()<<endl;
    cout<<miset.size()<<endl;
}

//关键字类型的要求
//使用关键字比较函数
void fun3()
{
    multiset<Sales_item, decltype(compareIsbn)*>
    bookstore(compareIsbn);
}

//pair类型
//它定义在头文件utility中,一个pair保存两个数据成员。pair是一个用来生成特定
//类型的模板
void fun4()
{
    pair<string, string> anon;      //保存两个string
    pair<string, size_t> word_count;    //保存一个string和一个size_t
    pair<string, vector<int>> line;     //保存string和vector<int>
    //我们也可以为每个成员提供初始化器
    pair<string, string> author{"James","Joyce"};

}

//创建pair对象函数
pair<string, int>
process(vector<string> &v)
{
    //处理v
    if(!v.empty())
        return {v.back(), v.back().size()};     //列表初始化
    else
        return pair<string, int>();     //隐式构造返回值
}

//练习11.12
/*
功能:读入string和int序列,将每个string和int存入一个pair中,pair保存在一个vector中
时间:2014年6月25日09:28:06
作者:cutter_point
*/
void fun6()
{
    pair<string, int> p;
    vector<pair<string, int>> vp;
    string s1;
    int i1;
/*
    vp.push_back(make_pair("why",1));
    vp.push_back(make_pair("it",2));
    vp.push_back(make_pair("can`t",3));
    vp.push_back(make_pair("xunhuan",4));
    vp.push_back(make_pair("input",5));
*/

    while(cin>>s1 && cin>>i1)
    {
        vp.push_back(make_pair(s1,i1));
    }

    for(auto v1 : vp)
        cout<<v1.first<<"  "<<v1.second<<endl;
}


int main()
{
    fun6();
    return 0;
}



PS:尼玛这电脑室越来越不中用了!!!发火,希望能撑到我大四结束啊大哭求你了