C++ STL map和multimap

1、map简介

  map 是关联容器的一种,map 的每个元素都分为关键字和值两部分,容器中的元素是按关键字排序的,并且不允许有多个元素的关键字相同。
  注意:不能直接修改 map 容器中的关键字。因为 map 中的元素是按照关键字排序的,当关键字被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破坏,再在其上进行查找等操作就会得到错误的结果。
要使用 map,必须包含头文件 <map>。

2、map的定义

template < class Key, class T, class Pred = less<Key>, class A = allocator<T> >
class map{
  ...
  typedef pair< const Key, T > value_type;
  ...
};

map 和 multimap 十分类似,区别在于 map 容器中元素的关键字不能重复。multimap 有的成员函数,map 都有。此外,map 还有成员函数 operator[]:
  T & operator[] (Key k);

该成员函数返回 first 值为 k 的元素的 second 部分的引用。如果容器中没有元素的 first 值等于 k,则自动添加一个 first 值为 k 的元素。如果该元素的 second 成员变量是一个对象,则用无参构造函数对其初始化。

  map<int,vector<int> >最右边的两个>之间要有空格,否则 Dev C++ 会将它们当作右移运算符,导致编译出错。在 Visual Studio 2010 中无此问题。在不存在查询的元素的情况下,会自动创建一个指定关键值和默认值为0的键值对插入容器。

3、multimap简介

  multimap 是关联容器的一种,multimap 的每个元素都分为关键字和值两部分,容器中的元素是按关键字排序的,并且允许有多个元素的关键字相同。

  注意:不能直接修改 multimap 容器中的关键字。因为 multimap 中的元素是按照关键字排序的,当关键字被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破坏,再在其上进行查找等操作就会得到错误的结果。
使用 multimap 必须包含头文件 map。

4、multimap的定义

template < class Key, class T, class Pred = less<Key>, class A = allocator<T> >
class multimap
{
  ...
  typedef pair <const Key, T> value_type;
  ...
};

  multimap 中的元素都是 pair 模板类的对象。元素的 first 成员变量也叫“关键字”,second 成员变量也叫“值”。multimap 容器中的元素是按关键字从小到大排序的。默认情况下,元素的关键之间用 less <Key> 比较大小,也就是用<运算符比较大小。multimap 允许多个元素的关键字相同。
  multimap 中的 value_type 实际上就表示容器中元素的类型。C++ 允许在类的内部定义类型。

5、成员函数

  iterator find( const Key & val); 在容器中查找关键字等于 val 的元素,返回其迭代器;如果找不到,返回 end()
  iterator insert (pair <Key, T> const &p); 将 pair 对象 p 插入容器中并返回其迭代器
  void insert(iterator first, iterator last); 将区间 [first, last) 插入容器
  int count( const Key & val); 统计有多少个元素的关键字和 val 相等
  iterator lower_bound( const Key & val); 查找一个最大的位置 it,使得 [begin( ), it) 中所有的元素的关键字都比 val 小
  iterator upper_bound(const Key & val); 查找一个最小的位置 it,使得 [it, end()) 中所有的元素的关键字都比 val 大
  pair < iterator, iterator > equal_range (const Key & val); 同时求得 lower_bound 和 upper_bound
  iterator erase(iterator it); 删除 it 指向的元素,返回其后面的元素的迭代器(Visual Studio 2010 中如此,但是在 C++ 标准和 Dev C++ 中,返回值不是这样)
  iterator erase(iterator first, iterator last); 删除区间 [first, last),返回 last(Visual Studio 2010 中如此,但是在 C++ 标准和 Dev C++ 中,返回值不是这样)

  multimap 及 map 中的 find 和 count 不用==运算符比较两个关键字是否相等。如果x比y小和y比x小同时为假,就认为 x 和 y 相等。
  multimap 容器中的元素必须是 pair 类模板对象。

猜你喜欢

转载自www.cnblogs.com/Sheenagh/p/12217436.html