关联容器

      顺序容器:vector、list、deque、queue、stack、slist。

      关联容器:map、set、multiset、multimap、hashtable(散列表),以及以hashtable为底层机制完成的hash_set(散列集合)/hash_map(散列映射表)/hash_multiset(散列多键集合)/hash_multimap(散列多键映射表)。

     本文总结了Primer上的内容包括set、multiset、map、multimap。


关联容器注意点

    (1)关联容器不提供front、push_front、pop_front、back、push_back以及pop_back接口;

    (2)关联容器的三种构造函数:C<T> c; C<T>c1(c2)和 C<T>c(b,e);不能通过容器大小来定义

    (3)关联容器不提供assign函数;

    (4)关联容器提供clear和erase操作;

    (5)关联容器的健类型,必须相关的比较函数。默认情况下,标准库采用键的"<"操作符来实现键的比较

    (6)关联容器两个常用的接口:find和count;


map关联容器

1、pair类型

构造函数:pair<T1,T2>p1、pair<T1,T2>p1(v1,v2);除了这样还可以用make_pair来生成pair。

        p1.first:第一个成员;(公有成员、可直接访问

        p1.second:第二个成员;(公有成员、可直接访问)

2.map 键-值对集合

        map定义的三个数据类型:key_type(键的类型)、mapped_type(键关联值的类型)和value_type(pair类型、用map::iterator获得的数据类型也是pair类型

map<string,int>word_count;
word_count["Anna"] = 1;

       上面程序所执行的操作:(1)在word_count中查找“Anna”,没有找到;

                                               (2)插入一个新的默认键值对插入;                                       

                                               (3)读出这个键值对,并将其值赋为1。

注;使用下标访问map中的元素,如果map不存在这个元素,将添加元素。

       利用上面这个特性可以编一个单词统计程序:

map<string,int>word_count;
string word;
while(cin>word){
	++word_count[word]
}


3.map的insert操作

       <iterator  bool> insert(e);//e是一个pair类型的值,如果map中已存在e,则不插入,返回<e.first,false>;否则插入,返回<e.first,true>

       insert(beg,end);//将迭代器beg---end之间插入map中。(类型必须是pair类型)

范例1:

word_count.insert(make_pair("Anna",1));

范例2:

map<string,int>word_count;
string word;
while(cin>word){
     pair<map<string,int>::iterator bool>ret
        =  word_count.insert(make_pair(word,1));
     if(!ret.second)//表示map中已经存在
	++ret.first->second;
}

4.find和count操作

//find找到了返回其迭代器,找不到返回end
map<string,int>::iterator iter = word_count.find("lsj");
if(iter!=word_count.end())//不等于end表示找到了,没有等于end
   ...
//count查找的键值在map中的个数,0表示没有,1表示有(map中只能为1)
int occurs = 0;
if(word_count.count("lsj"))//找到
    occurs = word_count["lsj"]


5.map的删除操作

      m.erase(k);//删除键为k的元素

      m.erase(p);//删除迭代器p所指向的元素

      m.erase(b,e);//删除迭代器之间的元素

set关联容器

      set中只有键类型,操作和map一样,没有值类型


multiset、multimap关联容器

    (1)multiset和multimap不支持下标元素,因为有可能某个键对应的元素不只一个。

    (2)erase(k)会删除所有键为“k”的元素,返回删除的个数。

    (3)find操作返回第一个拥有正在查找键的实例。

    (4)count()输出指定键元素的个数。

    (5)额外的接口:m.lower_bound(k):返回指向键不小于k的第一个元素;

m.upper_bound(k):返回指向键大于k的第一个元素;上面两者合起来正好是键等于K的范围。

m.equal_range(k):返回pair类型。<first,second>,其实first =   m.lower_bound(k),second = m.upper_bound(k)

//这么实现
typedef multimap<string,string>::iterator Iter;
Iter beg = author.lower_bound(search_item);
Iter end= author.upper_bound(search_item);
while(beg!=end){
       ...
      ++beg;
}
//或者这么编
pair<Iter,Iter> pos = uthor.equal_range(search_item);
while(pos.first!=pos.second){
      ....
      pos.second++;
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值