重读C++Primer学习笔记 关联容器

两个主要的关联容器是mapset
标准库提供8个关联容器,他们的不同体现在三个维度上

  • 或者是一个set,或者是一个map
  • 或者要求不重复的关键字 或者允许重复关键字
  • 按顺序保存 或无序保存
    允许重复关键字的容器名字中都包含multi,不保持关键字按顺序存储的容器名以unordered开头。
    无序容器使用哈希函数来组织元素
    map和multimap定义在 map头文件,set和multiset定义在set中
    无序容器则定义在unordered_map,unordered_set中
map<string, size_t> word_count;
set<string> exclude = {"THe","But","the","but"};

string word;
while(cin>>word)
    if (exclude.find(word) == exclude.end())
        ++word_count[word];

对于有序容器,关键字类型必须定义元素比较的方法
我们可以提供自己定义的操作来替代<运算符,但这必须是一个严格弱序

c++Primer第五版第379页 pair类型

pair标准库类型定义在 头文件 utility中

pair<string,string> anon;
pair<string, vector<int>> line;
pair<string, string> author{"James","Arthur"};//提供初始化列表

与其他标准库类型不同,pair的数据成员是public的,分别命名为first和second
map的元素是pair,因此可以用first访问元素的first成员
make_pair(v1,v2)返回一个用v2和v2初始化的pair

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

关联容器中的类型

set<string>::value_type v1;//v1是一个string
set<string>::key_type v2;//v2是一个string
map<string, int>::value_type v3;//v3是一个pair<const string,int>
map<string,int>::key_type v4;//v4是一个string
map<string,int>::mapped_type v5;//v5是一个int

只有map类型才有mapped_type
我们通常不对关联容器使用泛型算法。可用于只读取元素的算法,但这类算法都要搜索序列,而关联容器中的元素不能通过他们的关键字进行(快速)查找,所以对其使用泛型搜索算法几乎总是个坏主意。
实际编程中,如果我们真要对一个关联容器使用算法,通常将他作为一个源序列或者目的位置。

C++Primer第五版 第384页 关联容器 添加/删除元素
vector<int> ivec = {2,4,6,8,2,4,6,8};
set<int> set2;
set.insert(ivec.cbegin(), ivec.cend());//迭代器为参数
set.insert({1,3,5,7,1,3,5,7});//初始化列表为参数

向map添加元素时,必须添加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));
//
c.insert(p,v)
c.emplace(p,args)//将迭代器p作为一个提示,返回一个迭代器

关联容器定义了三个版本的erase,传递一个迭代器或者迭代器对
一个额外的erase,传递一个key_type来删除给定关键字的元素

C++Primer第五版 第388页 关联容器查找操作
map和unorderedmap的下标操作只适用非const
c[k]
c.at(k)
lower_bound,upper_bound不适用无序容器
c.find(k)返回一个迭代器指向第一个k,否则指向end
c.count(k)返回等于k的数量
c.lower_bound(k)返回一个迭代器,指向第一个关键字不小于k的元素
c.upper_bound(k)返回一个迭代器 指向第一个关键字大于k的元素
c.equal_range(k)返回一个迭代器pair,表示关键字等于k的范围,如果没有返回end

对map和unordered_map类型,下标运算符提供了一个最简单的提取元素的方法。但有一个严重的副作用,如果关键字未在map中,下标操作会插入一个具有给定关键字的元素。这种行为是否正确 完全依赖于我们的预期。因此当只想知道一个关键字是否存在,却不想插入新元素时,
可以用findword_count.find("foobar")==word_count.end()

c++ Primer 第五版 第395页 无序容器桶管理

跳过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值