读书笔记:C++ primer 5th edition--chapter11.关联容器


part1.概述
1.关联容器中的元素是按关键字来保存和访问的,顺序容器是按它们在容器中的位置来顺序保存访问的。
2.8个关联容器。不同之处有三:1)set/map 2)是否允许重复关键字 (multi)3)顺序还是无序(unordered)。 
3.关联容器也是模板。

part2.map
1.如果map不含key,那么下标运算会创建新元素。eg:++word_count[ word]。所以只能对非const的map使用下标。或者使用at,带参数检查。
2.map<string, int >::mapped_type, will get :pair < const key_type, mapped_type >
3.可以改变pair,但是不能改变关键字成员的值。
4.添加元素 word_count.insert( { word, 1 } ) or word_count.insert( make_pair(word, 1) )
5.插入返回值:
1)对于非multi的容器,返回一个pair,pair->first指向具有给定关键字的元素(所插入元素),pair->second是一个bool,表示是否插入成功(如已经存在则false);
auto ret = word_count.insert({word, 1})
if (!ret.second)          //word已在,手动+1
     ++ ret.fisrt->second;
2)对于multi的容器,一定会添加,所以返回一个指向新元素的迭代器
6.对map进行下标操作,会获得一个mapped_type对象,但当解引用一个map迭代器,会得到一个value_type对象。
7.对于map,使用find代替下标。we also have “count”

part3.set
1.常用用途是检查是否包含某元素
set <string> exclude = {“the”, “but”,...};
if ( exclude.find( word ) == exclude.end() ) …//只统计不在exclude里的单词
2.可以用vector构造
set < int > iset (ivec.cbegin(), ivec.cend() );//自动舍弃重复元素
3.对于set,key_type,value_type相同
4.关键字只读

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

part5.操作
1.key_type,value_type,mapped_type
2.不对关联容器使用泛型算法。且使用专用find成员比泛型要快很多。
3.有序容器-map,multimap,set multiset,关键字类型必须定义元素的比较方法。比较函数要满足严格弱序。
4.遍历有序容器,迭代器按关键字升序遍历元素。
5.删除操作,对于multi容器,删除元素数量可能大于1,使用erase
6.下面三种等价:
//1st ver
string search_item(“xxx”);
auto entries  = authors.count(search_item)     //num of element
auto iter = authors.find(search_item)     //first book
while(entries){
     cout << iter->second << endl;
     ++iter;
     —entries;
}

//2nd ver
for( auto beg = authors.lower_bound(search_item),
               end = authors.upper_bound(search_item);
          beg != end; ++beg)
     cout << beg->second << endl;

//3rd ver
for(auto pos = authors.equal_range(search_item );
          pos.first != pos.second; ++ pos.first )
     cout << pos.first->second << endl;

7.无序容器
1)如果关键字类型固有无序,或者性能测试发现问题可以用哈希技术解决,可以用无序容器。
2)通常可以用有序容器替换。
3)无序容器使用一个哈希函数将元素映射到桶。因此性能依赖于哈希函数质量,以及桶的数量和大小。
4)自定义类型的无序容器,需要提供自己的hash模板。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值