• C++ Primer 学习笔记_34_STL实践与分析(8) --引言、pair类型、关联容器


    STL实践与分析

    --引言、pair类型、关联容器



    引言:

        关联容器与顺序容器的本质差别在于:关联容器通过键[key]来存储和读取元素,而顺序容器则通过元素在容器中的位置顺序的存取元素。

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

        set仅包括一个键,并有效的支持关于某个键是否存在的查询。

    关联容器类型

    map

    关联数组:元素通过键来存取

    Set

    大小可变的集合,支持通过键来实现的高速读取

    multimap

    支持同一个键多次出现map类型

    multiset

    支持同一个键多次出现set类型


        一般来说,假设希望有效地存储不同值的集合,那么使用set容器比較合适,map容器则更适用于须要存储(乃至改动)每一个键所关联的值的情况

       setmap类型的对象不同意为同一个键加入第二个元素。假设一个键必须相应多个实例,则需使用multimapmultiset,这两种类型同意多个元素拥有同样的键

    一、pair类型

    pair类型在utility头文件里定义:

    	#include <utility>


    pair类型提供的操作

    pair<T1,T2>p1

    创建一个空的pair对象,他的两个元素各自是T1T2类型,採用值初始化

    pair<T1,T2>p1(v1,v2)

    创建一个pair对象,它的两个元素各自是T1T2,当中first成员初始化为v1,second成员初始化为v2

    make_pair(v1,v2)

    v1v2值创建一个新的pair对象,其元素类型分别为v1v2的类型

    p1< p2

    两个pair对象之间的小于运算,其定义遵循字典次序:假设p1.first< p2.first 或者!(p2.first< p1.first) && p1.second < p2.second,则返回true

    p1== p2

    假设两个pair对象的firstsecond成员依次相等,则这两个对象相等。该运算使用其元素的==操作符

    p.first

    返回p中名为first(公有)数据成员

    p.second

    返回p的名为second(公有)数据成员


    1pair的创建和初始化

        在创建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");
    

    2pair对象的操作

        与其它标准库类型不同:对于pair类,能够直接訪问其数据成员,由于其数据成员都是公有的,分别命名为firstsecond

        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、关联容器共享大部分– 但并非全部的顺序容器的操作:关联容器不支持frontpush_frontpop_frontbackpop_back操作。


    2、顺序容器和关联容器公共的操作有一下几种:

        1)表9.2描写叙述的前三种构造函数:

        2)关联容器不能通过容器大小来定义,由于这种话就无法知道键所相应的值是什么。

        3)第9.3.4节中描写叙述的关系运算。

        4)表9.6列出的beginendrbeginrend操作。

        5)表9.5列出的类型别名(typedef)。注意,对于map容器,value_type并不是元素的类型,而是描写叙述键及其关联值类型的pair类型。

        6)表9.11中描写叙述的 swap和赋值操作。但关联容器不提供assign函数。

        7)表9.10列出的 clearerase操作,但关联容器的erase运算返回 void类型。

        8)表9.8列出的关于容器大小的操作。但resize函数不能用于关联容器。


    3、依据键排列元素

        除了上述列出的操作之外,关联容器还提供了其它的操作。而对于顺序容器也提供的同样操作,关联容器也又一次定义了这些操作的含义或返回类型,当中的区别在于关联容器中使用了键

        容器元素依据键的次序排列”:在迭代关联容器时,我们能够确保依照键的顺序訪问元素,而与元素在容器中的位置全然无关

  • 相关阅读:
    2.Magicodes.NET框架之路——策略管理
    1.Magicodes.NET框架之路——起航
    为什么LINQ to XML的性能要优于XmlDocument?
    SharePoint如何配置Ipad跳转等问题
    写给自己
    ERP,SCM,CRM,BRP,OMS,WMS 企业管理的6大核心系统
    spring 发送邮件问题
    spring各种邮件发送
    css background-position结合disaply:inline-block使用
    .Net 两大利器Newtonsoft.NET和Dapper
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3759018.html
Copyright © 2020-2023  润新知