简单介绍

在头文件<map> 中定义

  1. namespace std
  2. {
  3. template <typename Key, typename T,
  4. typename Compare = less<Key>,
  5. typename Allocator = allocator<pair<const Key,T> > >
  6. class map;
  7. template <typename Key, typename T,
  8. typename Compare = less<Key>,
  9. typename Allocator = allocator<pair<const Key,T> > >
  10. class multimap;
  11. }

map和multimap都是有序关联容器,包括具有唯一键的键值对。键使用比較函数Compare比較来进行排序。搜索。删除和插入操作具有对数复杂性。

map和multimap通常实现为红黑树。

multimap相对map来说可以同意反复值的存在。

map和multimap操作

构造、复制与析构

  1. map c //默认构造函数。创建一个空map/multimap
  2. map c(op) //创建一个空map/multimap,并以op原则作为排序准则
  3. map c(c2) //复制构造函数;创建一个新的map/multimap作为c2的副本(全部元素都被复制)
  4. map c = c2 //复制构造函数;创建一个新的map作为c2的副本(全部元素都被复制)
  5. map c(rv) //移动构造函数;使用右值对象rv创建一个新map/multimap
  6. map c = rv //移动构造函数。使用右值对象rv创建一个新map/multimap
  7. map c(beg,end) //创建一个map/multimap,并使用beg到end范围内的值进行初始化
  8. map c(beg,end,op) //创建一个map/multimap,并使用beg到end范围内以op原则排序后的值进行初始化
  9. map c(initlist) //创建一个map/multimap,并使用初始化列表进行初始化
  10. map c = initlist //创建一个map/multimap,并使用初始化列表进行初始化
  11. c.~map() //销毁全部元素并释放内存

在这里map可能是例如以下的一种:

  1. map<Key,Val> //以less<>为排序准则的map
  2. map<Key,Val,Op> //以op为排序准则的map
  3. multimap<Key,Val> //以less<>为排序准则的multimap
  4. multimap<Key,Val,Op> //以op为排序准则的multimap

非变动性操作

  1. c.key_comp() //返回比較准则
  2. c.value_comp() //返回对值比較的标准 (与
  3. key_comp()同样)
  4. c.empty() //推断容器是否为空,与size()==0同样,但可能更快
  5. c.size() //返回当前元素数量
  6. c.max_size() //返回可容纳的元素最大数量
  7. c1 == c2 //推断c1与c2是否相等
  8. c1 != c2 //推断c1与c2是否不相等,等同于!(c1==c2)
  9. c1 < c2 //推断c1是否小于c2
  10. c1 > c2 //推断c1是否大于c2
  11. c1 <= c2 //推断c1是否小于等于c2
  12. c1 >= c2 //推断c1是否大于等于c2

特殊查询操作

  1. c.count(key) //返回键值为key的元素个数
  2. c.find(key) //返回第一个键值为key的位置,若没找到返回end()
  3. c.lower_bound(key) //返回键值为key的第一个可插入的位置。也就是键值 >= key的第一个元素位置
  4. c.upper_bound(key) //返回键值为key的最后一个可插入的位置,也就是键值 > key的第一个元素位置
  5. c.equal_range(key) //返回键值为key的可插入的第一个位置和最后一个位置的区间。也就是键值 == key的元素区间

赋值

  1. c = c2 //将c2全部元素赋值给c
  2. c = rv //将右值对象rv的全部元素移动赋值给c
  3. c = initlist //使用初始化列表进行赋值
  4. c1.swap(c2) //交换c1和c2的数
  5. swap(c1,c2) //交换c1和c2的数

迭代器相关函数

  1. c.begin() //返回一个双向迭代器,指向第一个元素
  2. c.end() //返回一个双向迭代器,指向最后一个元素
  3. c.cbegin() //返回一个双向常迭代器,指向第一个元素
  4. c.cend() //返回一个双向常迭代器,指向最后一个元素
  5. c.rbegin() //返回一个逆向迭代器,指向逆向迭代的第一个元素
  6. c.rend() //返回一个逆向迭代器,指向逆向迭代的最后一个元素
  7. c.crbegin() //返回一个逆向常迭代器,指向逆向迭代的第一个元素
  8. c.crend() //返回一个逆向常迭代器,指向逆向迭代的最后一个元素

插入和移除元素

  1. c.insert(val) //插入一个val的副本,返回新元素位置(对map来说不论成功与否)
  2. c.insert(pos,val) //插入一个val副本,返回新元素位置(pos应该是插入的搜寻起点)
  3. c.insert(beg,end) //将范围beg到end的全部元素的副本插入到c(无返回值)
  4. c.insert(initlist) //插入初始化列表的全部元素的副本(无返回值)
  5. c.emplace(args...) //插入一个使用args初始化的元素副本。返回新元素位置(对map来说不论成功与否)
  6. c.emplace_hint(pos,args...) //插入一个使用args初始化的元素副本,返回新元素位置(pos应该是插入的搜寻起点)
  7. c.erase(val) //移除全部与val值相等的元素,并返移除的元素个数
  8. c.erase(pos) //移除迭代器位置的元素,并返回下个元素的位置
  9. c.erase(beg,end) //移除beg到end范围内的全部元素,并返回下个元素的位置
  10. c.clear() //移除所以元素。清空容器

键值对转递

  1. //使用value_type
  2. std::map<std::string,float> coll;
  3. coll.insert(std::map<std::string,float>::value_type("otto",22.3));
  4. //使用pair<>
  5. std::map<std::string,float> coll;
  6. coll.insert(std::pair<std::string,float>("otto",22.3));
  7. //使用make_pair()
  8. std::map<std::string,float> coll;
  9. coll.insert(std::make_pair("otto",22.3));

把map当作关联数组使用

  1. c[key] //返回一个指向键值为key的元素的引用,假设不存在就插入这个元素
  2. c.at(key) //返回一个指向键值为key的元素的引用

栗子1

  1. //使用算法和lambda
  2. #include <map>
  3. #include <string>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7. int main()
  8. {
  9. map<string,double> coll { { "tim", 9.9 }, { "struppi", 11.77 } };
  10. //对每一个元素的值平方
  11. for_each (coll.begin(), coll.end(),
  12. [] (pair<const string,double>& elem)
  13. {
  14. elem.second *= elem.second;
  15. });
  16. //输出元素
  17. for_each (coll.begin(), coll.end(),
  18. [] (const map<string,double>::value_type& elem)
  19. {
  20. cout << elem.first << ": " << elem.second << endl;
  21. });
  22. return 0;
  23. }

输出1

  1. struppi: 138.533
  2. tim: 98.01

栗子2

  1. //当作关联数组使用
  2. #include <map>
  3. #include <string>
  4. #include <iostream>
  5. #include <iomanip>
  6. using namespace std;
  7. int main()
  8. {
  9. //创建map。键为string,值为float
  10. typedef map<string,float> StringFloatMap;
  11. StringFloatMap stocks;
  12. //插入元素
  13. stocks["BASF"] = 369.50;
  14. stocks["VW"] = 413.50;
  15. stocks["Daimler"] = 819.00;
  16. stocks["BMW"] = 834.00;
  17. stocks["Siemens"] = 842.20;
  18. //输出元素
  19. StringFloatMap::iterator pos;
  20. cout << left; //左对齐
  21. for (pos = stocks.begin(); pos != stocks.end(); ++pos)
  22. {
  23. cout << "stock: " << setw(12) << pos->first
  24. << "price: " << pos->second << endl;
  25. }
  26. cout << endl;
  27. //全部price翻一番
  28. for (pos = stocks.begin(); pos != stocks.end(); ++pos)
  29. {
  30. pos->second *= 2;
  31. }
  32. //输出元素
  33. for (pos = stocks.begin(); pos != stocks.end(); ++pos)
  34. {
  35. cout << "stock: " << setw(12) << pos->first
  36. << "price: " << pos->second << endl;
  37. }
  38. cout << endl;
  39. // 改动VM键为Volkswagen键
  40. stocks["Volkswagen"] = stocks["VW"];
  41. stocks.erase("VW");
  42. //输出元素
  43. for (pos = stocks.begin(); pos != stocks.end(); ++pos)
  44. {
  45. cout << "stock: " << setw(12) << pos->first
  46. << "price: " << pos->second << endl;
  47. }
  48. return 0;
  49. }

输出2

  1. stock: BASF price: 369.5
  2. stock: BMW price: 834
  3. stock: Daimler price: 819
  4. stock: Siemens price: 842.2
  5. stock: VW price: 413.5
  6. stock: BASF price: 739
  7. stock: BMW price: 1668
  8. stock: Daimler price: 1638
  9. stock: Siemens price: 1684.4
  10. stock: VW price: 827
  11. stock: BASF price: 739
  12. stock: BMW price: 1668
  13. stock: Daimler price: 1638
  14. stock: Siemens price: 1684.4
  15. stock: Volkswagen price: 827

栗子3

  1. //作为字典使用
  2. #include <map>
  3. #include <string>
  4. #include <iostream>
  5. #include <iomanip>
  6. using namespace std;
  7. int main()
  8. {
  9. //创建multimap作为字典
  10. multimap<string,string> dict;
  11. //插入元素
  12. dict.insert ( { {"day","Tag"}, {"strange","fremd"},
  13. {"car","Auto"}, {"smart","elegant"},
  14. {"trait","Merkmal"}, {"strange","seltsam"},
  15. {"smart","raffiniert"}, {"smart","klug"},
  16. {"clever","raffiniert"}
  17. } );
  18. //输出元素
  19. cout.setf (ios::left, ios::adjustfield);
  20. cout << ' ' << setw(10) << "english "
  21. << "german " << endl;
  22. cout << setfill('-') << setw(20) << ""
  23. << setfill(' ') << endl;
  24. for ( const auto& elem : dict )
  25. {
  26. cout << ' ' << setw(10) << elem.first
  27. << elem.second << endl;
  28. }
  29. cout << endl;
  30. //输出全部smart键的值
  31. string word("smart");
  32. cout << word << ": " << endl;
  33. for (auto pos = dict.lower_bound(word);
  34. pos != dict.upper_bound(word);
  35. ++pos)
  36. {
  37. cout << " " << pos->second << endl;
  38. }
  39. //输出所以值为raffiniert的键
  40. word = ("raffiniert");
  41. cout << word << ": " << endl;
  42. for (const auto& elem : dict)
  43. {
  44. if (elem.second == word)
  45. {
  46. cout << " " << elem.first << endl;
  47. }
  48. }
  49. return 0;
  50. }

输出3

  1. english german
  2. --------------------
  3. car Auto
  4. clever raffiniert
  5. day Tag
  6. smart elegant
  7. smart raffiniert
  8. smart klug
  9. strange fremd
  10. strange seltsam
  11. trait Merkmal
  12. smart:
  13. elegant
  14. raffiniert
  15. klug
  16. raffiniert:
  17. clever
  18. smart

栗子4

  1. //查找
  2. #include <map>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <utility>
  6. using namespace std;
  7. int main()
  8. {
  9. // 创建键与值都为float的map,并初始化
  10. map<float,float> coll = { {1,7}, {2,4}, {3,2}, {4,3},
  11. {5,6}, {6,1}, {7,3}
  12. };
  13. //查询一个key为3的元素。对数时间复杂度
  14. auto posKey = coll.find(3.0);
  15. if (posKey != coll.end())
  16. {
  17. cout << "key 3.0 found ("
  18. << posKey->first << ":"
  19. << posKey->second << ")" << endl;
  20. }
  21. //查询一个值为3的元素。线性时间复杂度
  22. auto posVal = find_if(coll.begin(),coll.end(),
  23. [] (const pair<float,float>& elem)
  24. {
  25. return elem.second == 3.0;
  26. });
  27. if (posVal != coll.end())
  28. {
  29. cout << "value 3.0 found ("
  30. << posVal->first << ":"
  31. << posVal->second << ")" << endl;
  32. }
  33. return 0;
  34. }

输出4

  1. key 3.0 found (3:2)
  2. value 3.0 found (4:3)

栗子5

  1. //结合string,执行时排序
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <map>
  5. #include <string>
  6. #include <algorithm>
  7. #include <cctype>
  8. using namespace std;
  9. //字符串比較函数,同意在执行事设置比較准则,同意在不分大写和小写的情况下比較
  10. class RuntimeStringCmp
  11. {
  12. public:
  13. //比較标准常数
  14. enum cmp_mode {normal, nocase};
  15. private:
  16. //实际比較模式
  17. const cmp_mode mode;
  18. //辅助函数。大小转化一致
  19. static bool nocase_compare (char c1, char c2)
  20. {
  21. return toupper(c1) < toupper(c2);
  22. }
  23. public:
  24. //构造函数: 初始化比較准则
  25. RuntimeStringCmp (cmp_mode m=normal) : mode(m)
  26. {
  27. }
  28. //比較
  29. bool operator() (const string& s1, const string& s2) const
  30. {
  31. if (mode == normal)
  32. {
  33. return s1<s2;
  34. }
  35. else
  36. {
  37. return lexicographical_compare (s1.begin(), s1.end(),
  38. s2.begin(), s2.end(),
  39. nocase_compare);
  40. }
  41. }
  42. };
  43. typedef map<string,string,RuntimeStringCmp> StringStringMap;
  44. //填充和输出函数
  45. void fillAndPrint(StringStringMap& coll);
  46. int main()
  47. {
  48. //以默认比較准则创建容器
  49. StringStringMap coll1;
  50. fillAndPrint(coll1);
  51. //创建一个不区分大写和小写的比較对象
  52. RuntimeStringCmp ignorecase(RuntimeStringCmp::nocase);
  53. //创建一个不区分大写和小写的比較准则容器
  54. StringStringMap coll2(ignorecase);
  55. fillAndPrint(coll2);
  56. return 0;
  57. }
  58. void fillAndPrint(StringStringMap& coll)
  59. {
  60. //插入元素
  61. coll["Deutschland"] = "Germany";
  62. coll["deutsch"] = "German";
  63. coll["Haken"] = "snag";
  64. coll["arbeiten"] = "work";
  65. coll["Hund"] = "dog";
  66. coll["gehen"] = "go";
  67. coll["Unternehmen"] = "enterprise";
  68. coll["unternehmen"] = "undertake";
  69. coll["gehen"] = "walk";
  70. coll["Bestatter"] = "undertaker";
  71. //输出元素
  72. cout.setf(ios::left, ios::adjustfield);
  73. for (const auto& elem : coll)
  74. {
  75. cout << setw(15) << elem.first << " "
  76. << elem.second << endl;
  77. }
  78. cout << endl;
  79. }

输出5

  1. Bestatter undertaker
  2. Deutschland Germany
  3. Haken snag
  4. Hund dog
  5. Unternehmen enterprise
  6. arbeiten work
  7. deutsch German
  8. gehen walk
  9. unternehmen undertake
  10. arbeiten work
  11. Bestatter undertaker
  12. deutsch German
  13. Deutschland Germany
  14. gehen walk
  15. Haken snag
  16. Hund dog
  17. Unternehmen undertake

STL学习笔记— —容器map和multimap的更多相关文章

  1. STL标准库-容器-map和multimap

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 map与multimap为关联容器,结构如下 map底层实现依然是rb_tree 他的data可以改,但是key不能改,因此ma ...

  2. Effective STL 学习笔记: Item 22 ~ 24

    Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...

  3. Effective STL 学习笔记 32 ~ 33

    Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  4. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  5. Effective STL 学习笔记 Item 30: 保证目标区间足够大

    Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...

  6. Effective STL 学习笔记 Item 21:Comparison Function 相关

    Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...

  7. Effective STL 学习笔记:19 ~ 20

    Effective STL 学习笔记:19 ~ 20 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  8. STL学习笔记(第四章 通用工具)

    本章讲解C++标准程序库中的通用工具.它们是由短小精干的类和函数构成. Pairs(对组) class pair可以将两个值视为一个单元.STL内多处使用了pair.尤其容器map和multimap, ...

  9. Effective STL 学习笔记 39 ~ 41

    Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

随机推荐

  1. GIS中的坐标系

    原文地址:http://www.cnblogs.com/onsummer/p/7451128.html 从第一次上地图学的课开始,对GIS最基本的地图坐标系统就很迷.也难怪,我那时候并不是GIS专业的 ...

  2. 自己动手制作更好用的markdown编辑器-03

    这里文章都是从个人的github博客直接复制过来的,排版可能有点乱. 原始地址 http://benq.im/2015/04/24/hexomd-03/ 文章目录 1. 系统模块 2. 记录上次打开的 ...

  3. QT学习二:工具栏

    QT  的工具栏提供 Dock 功能.文字/图标显示排列的功能. void MainWindow::createToolBar(void) { QToolBar *toolBar = new QToo ...

  4. C# 泛型方法

    泛型方法是使用类型参数声明的方法,如下所示: static void Swap<T>(ref T lhs, ref T rhs) { T temp; temp = lhs; lhs = r ...

  5. Java_MD5的使用

    在Java中使用MD5摘要还是很方便的,直接上代码. package com.cxc.nothing; import java.nio.charset.Charset; import java.sec ...

  6. iOS masonry布局在iOS11/12上正常 iOS9/10却异常

    使用masonry布局,可以布局一套,适配所有机型,但是有时候会出现一些比较特殊的情况,每次iOS11上面开发,开发完成之后,在iOS9,iOS10上查看的时候发现布局与iOS11不完全一致,有的高度 ...

  7. 一起talk C栗子吧(第八十七回:C语言实例--使用管道进行进程间通信概述)

    各位看官们,大家好.上一回中咱们说的是进程间通信的样例.这一回咱们说的样例是:使用管道进行进程间通信. 闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在前面的的章回中介绍了使用管道进行进程 ...

  8. 应用市场出新规,国内千款应用TargetSdkVersion调查分析

    ​​​近期,谷歌针对Google Play上架应用发布强制性适配Android 8.0公告,要求自2018 年 8 月 1 日起,所有向 Google Play 首次提交的新应用都必须基于 Andro ...

  9. php对gzip文件或者字符串解压实例参考

    要采集一个网站,目标站采用了gzip压缩传输网页,本来应该只要发送一个http头 Accept-Encoding: identity或者干脆不发送这个头等,就可以使目标站返回没有经过gzip压缩的页面 ...

  10. linux c 常常混淆的概念

    指针函数 and 函数指针 指针函数是指带指针的函数,即本质是一个函数.函数都有返回类型(假设不返回值,则为无值型),仅仅只是指针函数返回类型是某一类型的指针. 定义格式 类型名 *函数名(函数參数列 ...