第11章 关联容器

11.1 使用关联容器

关联容器类型
按关键字有序保存元素 
map关联数组。保存关键值-对
set关键字即值,即只保存关键字的容器
multimap关键字可重复出现的map
multiset关键字可重复出现的set
无序集合 
unordered_map用哈希函数组织的map
unordered_set用哈希函数组织的set
unordered_multimap哈希组织的map,关键字可以重复出现
unordered_multiset哈希组织的set,关键字可以重复出现

11.2 关联容器概述

11.2.3 pair类型

pair上的操作
pair<T1, T2> p定义一个pair类型对象,两个类型分别为T1和T2的成员都进行了值初始化
pair<T1, T2> p(v1, v2)定义一个pair类型对象,first和second成员分别用T1和T2进行初始化
pair<T1, T2>p = {v1, v2}等价于p(v1, v2)
make_pair(v1, v2)返回一个用v1和v2初始化的pair,pair的类型从v1和v2的类型推断出来
p.first返回p的名为first的公有数据成员
p.second返回p的名为second的公有数据成员

11.3 关联容器操作

关联容器额外的类型别名
key_type此容器类型的关键字类型
mapped_type每个关键字关联的类型;只适用于map
value_type

对于set,与keytype相同

对于map,为pair<const key_type, mapped_type>

11.3.1 关联容器迭代器

1、解引用一个关联容器的迭代器,会得到一个类型为容器的value_type的值的引用。

auto map_it = word_count.begin();
//*map是指向一个pair<const string, size_t>对象的引用
cout<<map_it->first;
cout<<map_it->second;
map_it->first = "new key";    //error 关键字是const的
map_it->second++;             //right 可以通过迭代器改变元素

11.3.2 添加元素

1、关联容器的insert操作

关联容器的insert操作
c.insert(v)v是value_type类型的对象
c.insert(b, e)b和e是迭代器,表示一个c::value_type类型值的范围
。。。 
//针对map容器类型,value_type是pair类型
word_count.insert({word, 1});
word_count.insert(make_pair(word, 1));
word_count.insert(pair<string, size_t>(word, 1));
word_count.insert(map<string, size_t>::value_type(word, 1));

11.3.3 删除元素

从关联容器删除元素
c.erase(k)从c中删除每个关键字为k的元素,返回一个size_type值,指出删除元素的数量
c.erase(p)从c中删除迭代器p指定的元素。p必须指向c中一个真实元素,不不能等于c.end()。返回一个指向p之后元素的迭代器,若p指向c中的尾元素,则返回c.end()
c.erase(b, e)删除迭代器对b和e所表示的范围中的元素。返回e

11.3.4 map的下标操作

map和unordered_map的操作
c[k]返回关键字为k的元素;如果k不在c中,添加一个关键字为k的元素,对其进行值初始化
c.at(k)返回关键字为k的元素,带参数检查;若k不在c中,抛出一个out_of_range异常

1、通常情况下,解引用一个迭代器(vector、string)所返回的类型与下标运算符返回的类型是一样的。但对map来说,当对一个map进行下标操作时,或获得一个mapped_type对戏那个;但当解引用一个map迭代器时,会得到一个value_type对象。

11.3.5 访问元素

在一个关联容器中查找元素的操作
c.find(k)返回一个迭代器,指向第一个关键字为k的元素,若k不在容器中,则返回尾后迭代器
c.count(t)返回关键字等于k的元素的数量,对于不允许重复关键字的容器,返回值永远是0或1
。。。 

1、对map使用find代替下标操作

if (word_count.find("tool_bar") == word_count.end()) {
    cout << "tool_bar is not in the map" <<endl;
}

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值