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 类模板对象。

原文地址:https://www.cnblogs.com/Sheenagh/p/12217436.html

时间: 2024-10-10 07:48:22

C++ STL map和multimap的相关文章

【C++ STL】Map和Multimap

1.结构 Map和multimap将key/value pair(键值/实值 队组)当作元素,进行管理.他们根据key的排序准则将元素排序.multimap允许重复元素,map不允许. 元素要求: key/value必须具有assigned(可赋值)和copyable(可复制的)性质. 对于排序而言,key必须具是comparable(可比较的). 2.能力 典型情况下,set,multisets,map,multimap使用相同的内部结构,因此可以将set和multiset当成特殊的map和m

STL标准库-容器-map和multimap

摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 map与multimap为关联容器,结构如下 map底层实现依然是rb_tree 他的data可以改,但是key不能改,因此map仍然具有自动排序的功能 我们无法使用迭代器改变元素的key(const key),但是可以改变元素的data. map的key必须独一无二,multimap的key可以重复 map的定义函数 template <typename _Key, typename _Tp, typena

GEEK学习笔记— —STL容器map和multimap

简介 在头文件<map> 中定义 namespace std { template <typename Key, typename T, typename Compare = less<Key>, typename Allocator = allocator<pair<const Key,T> > > class map; template <typename Key, typename T, typename Compare = less

详解map、multimap、unordered_map、unordered_multimap

详解map.multimap.unordered_map.unordered_multimap 相信有不少同学和我一样刚接触C++ STL,被其深深吸引.但是想弄懂每个模板类不是一个容易事.大家应该对vector.list.stack.queue等类比较了解了,所以今天详细介绍下几个很常用很强大但有点不太好懂的类map.multimap.unordered_map.unordered_multimap.乍一看都差不多都是什么map,但这肯定有所不同.下面就在一个一个讲解的同时,让大家了解这四个类

STL map详细用法和make_pair函数

今天练习华为上机测试题,遇到了map的用法,看来博客http://blog.csdn.net/sprintfwater/article/details/8765034:感觉很详细,博主的其他内容也值得学习:后面附上今天的练习题目. 首先make_pair Pairs C++标准程序库中凡是“必须返回两个值”的函数, 也都会利用pair对象 class pair可以将两个值视为一个单元.容器类别map和multimap就是使用pairs来管理其健值/实值(key/va lue)的成对元素. pai

正确使用stl map的find,erase方法

查找某个key对应的value的方法,有2种: 方法1: typedef std::multimap<boost::uint64_t,std::string>::iterator it it = mmap_.find( nCallLetter ); if ( it != mmap_.end()) { char key[20] = {0}; sprintf(key, "%I64d",it->first); qDebug("key = %s,value = %s

stl::map之const函数访问

如何在const成员数中访问stl::map呢?例如如下代码: string ConfigFileManager::MapQueryItem(const string& name) const { if (_map_name_value.find(name) != _map_name_value.end()) { return _map_name_value[name]; } return ""; } 上面的代码会报错:error C2678: 二进制“[”: 没有找到接受“c

hdu 4941 Magical Forest(STL map &amp; 结构体运用)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 220    Accepted Submission(s): 105 Problem Description There is a forest c

(转载)STL map与Boost unordered_map的比较

原链接:传送门 今天看到 boost::unordered_map,它与 stl::map的区别就是,stl::map是按照operator<比较判断元素是否相同,以及比较元素的大小,然后选择合适的位置插入到树中.所以,如果对map进行遍历(中序遍历)的话,输出的结果是有序的.顺序就是按照operator< 定义的大小排序.而boost::unordered_map是计算元素的Hash值,根据Hash值判断元素是否相同.所以,对unordered_map进行遍历,结果是无序的. 用法的区别就是