您的位置:首页 > 其它

关联容器

2013-08-14 00:01 375 查看
      顺序容器: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++;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  map set multiset multimap