c++Primer笔记(十 关联容器)

第十章:关联容器。set map multimap  multiset   键是只读的,试图修改只有出错的份

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

2.set仅仅包含一个键,并有效的支持关于某个键是否存在的查询。即保存的是1组唯一元素,只有键没有值。适用于有效的存储不同值的集合。

3.pair类型,定义在 utility头文件中。   pair<T1,T2> p1 ;  pair<T1,T2> p1(v1 , v2); make_pair( v1, v2 );  p1< p2 ; p1 == p2; p.first   ; p.second;

4.pair其成员是公有的,分别是 first  second . , 除了使用构造函数来进行创建,我还可以使用 make_pair函数来创建pair 对象。

5.说说list, vector , deque , map , set 他们的分别适用情况:

  list : 用于需要在容器中间位置插入和删除元素的情况。

  vector :用于需要随机访问元素的情况。

  deque :适用于需要在容器尾部或首部插入和删除元素的情况。

  map :适用于需要键值对的情况,

  set :适用于需要使用键集合的情况:例如:黑名单的建立和使用

 

Map:

1.他的键不但有一个类型,而且还有一个相关的比较函数。使用标准库键类型定义的<操作符实现比较。

2.比较函数必须在键类型上定义:严格弱排序。即,当一个键和自身比较时,肯定会导致false结果。

关于键类型,唯一的约束就是:必须支持 < 操作符。

3.map 的内部类型:value_type 是存储元素键和值的 pair类型。 而且还是 pair<const T1 key, T2 value> ,他的键是不可以修改的,他的值是可以修改的。

将map的迭代器解引用,得到的是pair对象哦。

4.使用下标访问和添加元素: map1["cwj"] ;  map1["add"]=3; 如果存在,则赋值,如果不存在这个key则创建。

注意:map下标操作符的返回值:是值类型。  map迭代器进行解引用返回的确实pair对象哦。这是与string , vector的不同之处。

5.insert() : map.insert(map<string,int>::value_type("anna",1));  使用insert可以避免下标操作符所带来的副作用:不必要的初始化。 map1.insert(make_pair("anna",1));

  如果试图插入insert()一个已经存在的值,那么insert将不做任何的操作。返回false,不会覆盖原值。

  insert()返回值是一个pair类型:包含一个迭代器,和一个bool值:  pair< map<string,int>::iterator , bool > ret= map1.insert( make_pair(word,1) ); 迭代器指向该元素。ret->xx

6.count  find 用于检查某个键是否存和其具体位置在而不会插入该键。  count返回值只能是1,0, m.count(k) ,返回m中出现的次数。  m.find(k) 返回迭代器,否则返回end()迭代器。  count 是否存在 ,  find 在哪个位置。

7.删除对象:erase(k)  erase(b,e)....

Set:

1.他的键是只读的,不可修改,与list相比,set适用于保存不修改的东东,list适用于保存经常修改的东东。

2. set<int> iset2( list1.begin() , list1.end() ); //注意:如果list1中有相同的值,那么set会自动过滤掉滴,放心好了,以保证set中的唯一性。

 

multimap mutiset类型:

1.multimap不支持下标运算。在使用multimap或multiset时,对于某个键,必须做好处理多个值的准备,而非只有单一的值。

2.带有一个键参数的erase函数将删除多有改建的所有元素,并且返回删除元素的个数。而带有一个或者一对迭代器参数的版本,只删除指定元素,返回void .

3.使用find , count 来查找。 count返回某键出现的次数,find返回一个迭代器,指向第一个拥有正在查找的键的实例。

     通过for循环迭代的次数依赖与count返回的值。

4.与众不同的面向迭代器的解决方案: 323page

   m.lower_bound(k)  ,返回一个迭代器,指向键不小于k的第一个元素。

  m.upper_bound(k) ,返回一个迭代器,指向键大于k的第一个i元素。

  m.equal_range(k)  ,返回一个pair对象,first是  lower_bound(k)  , second 是upper_bound(k)

在同一个键上调用lower_bound 和upper_bound键产生一个迭代器范围,指示出该键所关联的所有元素。 因为一个键对应多个元素,且键是根据大小顺序来排列的,所以,必定这些该键所关联的所有元素都是集中聚集在一起放置的。通过lower.... 和 upper...函数,我们不久找到了他们的范围了吗,呵呵。只是upper返回最后一个实例的下一个位置

,如果所查找的键不在该容器中,那么lower..  upper...所返回的是同一个迭代器,指向依据该键应该的排序的插入位置。还不错。(不是最后,而是排序返回的哦)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值