11.2关联容器概述

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

11.2.1定义关联容器

定义一个map时,必须既指明关键字类型又指明值类型;而定义一个set时,只需指明关键字类型,因为set中没有值。

关联容器的初始化

每个关联容器都定义了一个默认构造函数,它创建一个指定类型的空容器。我们可以将关联容器初始化为另一个同类型容器的拷贝,或是从一个值范围类初始化关联容器,只要这些值可以转化为容器所需类型就可以。

    //关联容器初始化
    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

map和set中的关键字必须是唯一的,即,对于一个给定的关键字,只能有一个元素的关键字等于它,容器multimap和multiset没有此限制。

#include<iostream>
#include<map>
#include<set>
#include<string>
#include<vector>
using namespace std;

int main()
{
    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;//打印出20
    cout << iset.size() << endl;//打印出10
    cout << miset.size() << endl;//打印出20
    return 0;
}

11.2.2关键组类型的要求

对于有序容器–map、multimap、set以及multiset,关键字类型必须定义元素比较方法。在集合类型中,关键字类型就是元素类型;在映射中,关键字类型就是元素的第一部分。

11.2.3 pair类型

pair定义在utility中。

//pair类型
//它定义在头文件utility中,一个pair保存两个数据成员。pair是一个用来生成特定
//类型的模板
    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>();     //隐式构造返回值
}

这里写图片描述

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main()
{
    map<int, string> a;
    multimap<int, string> ma;
    //                                  key键 value值
    a.insert(map<int, string>::value_type(1, "One"));
    a.insert(map<int, string>::value_type(2, "Two"));
    a.insert(map<int, string>::value_type(3, "Three"));
    a.insert(make_pair(-1, "Minus One"));
    a.insert(pair<int, string>(1000, "One Thousand"));
    a[1000000] = "One Million";

    cout << "map里一共有" << a.size() << "个key-value数据" << endl;
    cout << "这些数据是:" << endl;
    map<int, string>::const_iterator i;
    for (i = a.begin(); i != a.end(); ++i)
    {
        cout << "key: " << i->first << " ";
        cout << "Value: " << i->second.c_str();
        cout << endl;
    }

    ma.insert(multimap<int, string>::value_type(3, "Three"));
    ma.insert(multimap<int, string>::value_type(45, "Forty Five"));
    ma.insert(make_pair(-1, "Minus One"));
    ma.insert(pair<int, string>(1000, "One Thousand"));
    ma.insert(pair<int, string>(1000, "One Thousand"));
    cout << endl << "multimap里有" << ma.size() << "个数据." << endl;
    multimap<int, string>::const_iterator im;
    for (im = ma.begin(); im != ma.end(); ++im)
    {
        cout << "Key: " << im->first<<" ";
        cout << "Value: " << im->second.c_str();
        cout << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值