C++ STL MultiMap2

模板

template < class Key,                                     // multimap::key_type
           class T,                                       // multimap::mapped_type
           class Compare = less<Key>,                     // multimap::key_compare
           class Alloc = allocator<pair<const Key,T> >    // multimap::allocator_type
           > class multimap;

multimap是关联型容器,保存<key,value>键值对,多个值可以由相同的键。
map中的元素根据key和比较器排序。
在对单个元素索引时,会比unordered_multimap要慢一些。
但是multimap允许按照顺序查找一个子集。

特性

  • 关联关联:关联容器中的元素由其键引用,而不是由它们在容器中的绝对位置引用。
  • 排序有序:容器中的元素始终遵循严格的顺序。所有插入的元素按此顺序给出一个位置。
  • 键值对映射:每个元素将键与映射值相关联:键用于标识主要内容为映射值的元素。
  • 允许相同键多个等效键:容器中的多个元素可以具有等效键。
  • 分配器感知:容器使用分配器对象来动态处理其存储需求

插入

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main()
{
    // type of the collection
    typedef multimap<int,string> IntStringMMap;

    IntStringMMap coll;        // set container for int/string values

    // insert some elements in arbitrary order
    // - a value with key 1 gets inserted twice
    coll.insert(make_pair(5,"tagged"));
    coll.insert(make_pair(2,"a"));
    coll.insert(make_pair(1,"this"));
    coll.insert(make_pair(4,"of"));
    coll.insert(make_pair(6,"strings"));
    coll.insert(make_pair(1,"is"));
    coll.insert(make_pair(3,"multimap"));

    /* print all element values
     * - iterate over all elements
     * - element member second is the value
     */
    IntStringMMap::iterator pos;
    for (pos = coll.begin(); pos != coll.end(); ++pos) {
        cout << pos->first <<":\t" << pos->second << std::endl;
    }   
    cout << endl;
}

输出

1:  this
1:  is
2:  a
3:  multimap
4:  of
5:  tagged
6:  strings

查找

如果一个键对应多个值,官方文档并没指出会按什么规则返回哪一个值。

// multimap::find
#include <iostream>
#include <map>

int main ()
{
  std::multimap<char,int> mymm;

  mymm.insert (std::make_pair('x',10));
  mymm.insert (std::make_pair('y',20));
  mymm.insert (std::make_pair('z',30));
  mymm.insert (std::make_pair('z',40));

  std::multimap<char,int>::iterator it = mymm.find('x');
  mymm.erase (it);
  mymm.erase (mymm.find('z'));

  // print content:
  std::cout << "elements in mymm:" << '\n';
  std::cout << "y => " << mymm.find('y')->second << '\n';
  std::cout << "z => " << mymm.find('z')->second << '\n';

  return 0;
}

输出

elements in mymm:
y => 20
z => 40

equal_range

pair<const_iterator,const_iterator> equal_range (const key_type& k) const;
pair<iterator,iterator>             equal_range (const key_type& k);

返回键对应的所有元素的起始和结束迭代器。该函数返回一对,其pair:: first 是范围的下限(与lower_bound相同),而pair::second 是上限(与upper_bound相同)。

// multimap::equal_range
#include <iostream>
#include <map>

int main ()
{
  std::multimap<char,int> mymm;

  mymm.insert(std::pair<char,int>('a',10));
  mymm.insert(std::pair<char,int>('b',20));
  mymm.insert(std::pair<char,int>('b',30));
  mymm.insert(std::pair<char,int>('b',40));
  mymm.insert(std::pair<char,int>('c',50));
  mymm.insert(std::pair<char,int>('c',60));
  mymm.insert(std::pair<char,int>('d',60));

  std::cout << "mymm contains:\n";
  for (char ch='a'; ch<='d'; ch++)
  {
    std::pair <std::multimap<char,int>::iterator, std::multimap<char,int>::iterator> ret;
    ret = mymm.equal_range(ch);
    std::cout << ch << " =>";
    for (std::multimap<char,int>::iterator it=ret.first; it!=ret.second; ++it)
      std::cout << ' ' << it->second;
    std::cout << '\n';
  }

  return 0;
}

输出

mymm contains:
a => 10
b => 20 30 40
c => 50 60
d => 60
posted @ 2018-12-06 10:38  yatolk  阅读(221)  评论(0编辑  收藏  举报