C++中std::map的使用

主页 > 新闻资讯 > 软件开发资讯 > C++编程C++软件开发 >

C++中std::map的使用

   std::map是STL的一个关联容器。存储在map内的数据都是有序的。std::map中的元素默认按key值升序排序。一个map是一个键值对序列,即(key, value)对。它提供基于key的快速检索能力,在一个map中key值是唯一的。

下面是从其他文章中copy的测试代码,详细内容介绍可以参考对应的reference:

 

[cpp] view plain copy
 
  1. #include "map.hpp"  
  2. #include <iostream>  
  3. #include <map>  
  4. #include <string>  
  5.   
  6. //////////////////////////////////////////////////  
  7. // reference: https://www.sgi.com/tech/stl/Map.html  
  8. int test_map1()  
  9. {  
  10.     struct ltstr {  
  11.         bool operator()(const char* s1, const char* s2) const  
  12.         {  
  13.             return strcmp(s1, s2) > 0;  
  14.         }  
  15.     };  
  16.   
  17.     std::map<const char*, int, ltstr> months;  
  18.   
  19.     months["january"] = 31;  
  20.     months["february"] = 28;  
  21.     months["march"] = 31;  
  22.     months["april"] = 30;  
  23.     months["may"] = 31;  
  24.     months["june"] = 30;  
  25.     months["july"] = 31;  
  26.     months["august"] = 31;  
  27.     months["september"] = 30;  
  28.     months["october"] = 31;  
  29.     months["november"] = 30;  
  30.     months["december"] = 31;  
  31.   
  32.     std::cout << "june -> " << months["june"] << std::endl;  
  33.     std::map<const char*, int, ltstr>::iterator cur = months.find("june");  
  34.     std::map<const char*, int, ltstr>::iterator prev = cur;  
  35.     std::map<const char*, int, ltstr>::iterator next = cur;  
  36.     ++next;  
  37.     --prev;  
  38.     std::cout << "Previous (in alphabetical order) is " << (*prev).first << std::endl;  
  39.     std::cout << "Next (in alphabetical order) is " << (*next).first << std::endl;  
  40.   
  41.     // show content:  
  42.     for (std::map<const char*, int, ltstr>::const_iterator it = months.begin(); it != months.end(); ++it) {  
  43.         std::cout << it->first << " => " << it->second << '\n';  
  44.     }  
  45.   
  46.     return 0;  
  47. }  
  48.   
  49. ///////////////////////////////////////////////////////////////  
  50. // reference: http://www.yolinux.com/TUTORIALS/CppStlMultiMap.html  
  51. int test_map2()  
  52. {  
  53.     std::map<std::string, int> Employees;  
  54.   
  55.     // Examples of assigning Map container contents  
  56.   
  57.     // 1) Assignment using array index notation  
  58.     Employees["Mike C."] = 5234;  
  59.     Employees["Charlie M."] = 3374;  
  60.   
  61.     // 2) Assignment using member function insert() and STL pair  
  62.     Employees.insert(std::pair<std::string, int>("David D.", 1923));  
  63.   
  64.     // 3) Assignment using member function insert() and "value_type()"  
  65.     Employees.insert(std::map<std::string, int>::value_type("John A.", 7582));  
  66.   
  67.     // 4) Assignment using member function insert() and "make_pair()"  
  68.     Employees.insert(std::make_pair("Peter Q.", 5328));  
  69.   
  70.     std::cout << "Map size: " << Employees.size() << std::endl;  
  71.   
  72.     for (std::map<std::string, int>::iterator ii = Employees.begin(); ii != Employees.end(); ++ii) {  
  73.         std::cout << (*ii).first << ": " << (*ii).second << std::endl;  
  74.     }  
  75.   
  76.     Employees.erase("David D.");  
  77.   
  78.     std::cout << "Map size: " << Employees.size() << std::endl;  
  79.   
  80.     for (std::map<std::string, int>::iterator ii = Employees.begin(); ii != Employees.end(); ++ii) {  
  81.         std::cout << (*ii).first << ": " << (*ii).second << std::endl;  
  82.     }  
  83.   
  84.     Employees.clear();  
  85.     std::cout << "Map size: " << Employees.size() << std::endl;  
  86.     std::cout << "Map empty: " << Employees.empty() << std::endl;  
  87.   
  88.     return 0;  
  89. }  
  90.   
  91. ////////////////////////////////////////////////////////////  
  92. // reference: http://www.yolinux.com/TUTORIALS/CppStlMultiMap.html  
  93. class AAA  
  94. {  
  95.     friend std::ostream &operator<<(std::ostream &, const AAA &);  
  96.   
  97. public:  
  98.     int x;  
  99.     int y;  
  100.     float z;  
  101.   
  102.     AAA();  
  103.     AAA(const AAA &);  
  104.     ~AAA(){};  
  105.     AAA &operator=(const AAA &rhs);  
  106.     int operator==(const AAA &rhs) const;  
  107.     int operator<(const AAA &rhs) const;  
  108. };  
  109.   
  110. AAA::AAA()   // Constructor  
  111. {  
  112.     x = 0;  
  113.     y = 0;  
  114.     z = 0;  
  115. }  
  116.   
  117. AAA::AAA(const AAA &copyin)   // Copy constructor to handle pass by value.  
  118. {  
  119.     x = copyin.x;  
  120.     y = copyin.y;  
  121.     z = copyin.z;  
  122. }  
  123.   
  124. std::ostream &operator<<(std::ostream &output, const AAA &aaa)  
  125. {  
  126.     output << aaa.x << ' ' << aaa.y << ' ' << aaa.z << std::endl;  
  127.     return output;  
  128. }  
  129.   
  130. AAA& AAA::operator=(const AAA &rhs)  
  131. {  
  132.     this->x = rhs.x;  
  133.     this->y = rhs.y;  
  134.     this->z = rhs.z;  
  135.     return *this;  
  136. }  
  137.   
  138. int AAA::operator==(const AAA &rhs) const  
  139. {  
  140.     if (this->x != rhs.x) return 0;  
  141.     if (this->y != rhs.y) return 0;  
  142.     if (this->z != rhs.z) return 0;  
  143.     return 1;  
  144. }  
  145.   
  146. int AAA::operator<(const AAA &rhs) const  
  147. {  
  148.     if (this->x == rhs.x && this->y == rhs.y && this->z < rhs.z) return 1;  
  149.     if (this->x == rhs.x && this->y < rhs.y) return 1;  
  150.     if (this->x < rhs.x) return 1;  
  151.     return 0;  
  152. }  
  153.   
  154. int test_map3()  
  155. {  
  156.     std::map<std::string, AAA> M;  
  157.     AAA Ablob;  
  158.   
  159.     Ablob.x = 7;  
  160.     Ablob.y = 2;  
  161.     Ablob.z = 4.2355;  
  162.     M["C"] = Ablob;  
  163.   
  164.     Ablob.x = 5;  
  165.     M["B"] = Ablob;  
  166.   
  167.     Ablob.z = 3.2355;  
  168.     M["A"] = Ablob;  
  169.   
  170.     Ablob.x = 3;  
  171.     Ablob.y = 7;  
  172.     Ablob.z = 7.2355;  
  173.     M["D"] = Ablob;  
  174.   
  175.     for (std::map<std::string, AAA>::iterator ii = M.begin(); ii != M.end(); ++ii) {  
  176.         std::cout << (*ii).first << ": " << (*ii).second << std::endl;  
  177.     }  
  178.   
  179.     return 0;  
  180. }  
  181.   
  182. ///////////////////////////////////////////////  
  183. // reference: http://www.yolinux.com/TUTORIALS/CppStlMultiMap.html  
  184. class Person  
  185. {  
  186.     friend class PersonLessThan;  
  187. public:  
  188.     std::string firstName;  
  189.     std::string lastName;  
  190.   
  191.     Person(const std::string &firstName, const std::string &lastName);  
  192. };  
  193.   
  194. Person::Person(const std::string &_firstName, const std::string &_lastName)  
  195.     : firstName(_firstName), lastName(_lastName)  
  196. {}  
  197.   
  198. class PersonLessThan  
  199. {  
  200. public:  
  201.     bool operator( )(const Person& p1, const Person& p2) const {  
  202.         if (p1.lastName < p2.lastName)  
  203.             return(true);  
  204.         else if (p1.lastName == p2.lastName)  
  205.             return(p1.firstName < p2.firstName);  
  206.         else  
  207.             return(false);  
  208.     }  
  209. };  
  210.   
  211. int test_map4()  
  212. {  
  213.     std::map<Person, bool, PersonLessThan> M;  
  214.     Person p_1("Wilma""Flintstone");  
  215.     Person p_2("Betty""Rubble");  
  216.     Person p_3("Fred""Flintstone");  
  217.     Person p_4("Barney""Rubble");  
  218.   
  219.     M[p_1] = true;  
  220.     M[p_2] = true;  
  221.     M[p_3] = true;  
  222.     M[p_4] = true;  
  223.   
  224.     for (std::map<Person, bool>::iterator ii = M.begin(); ii != M.end(); ++ii) {  
  225.         std::cout << ((*ii).first).lastName << ", " << ((*ii).first).firstName << ": " << (*ii).second << std::endl;  
  226.     }  
  227.   
  228.     return 0;  
  229. }  
  230.   
  231. /////////////////////////////////////////////////  
  232. // reference: http://thispointer.com/stdmap-tutorial-part-1-usage-detail-with-examples/  
  233. int test_map5()  
  234. {  
  235.     std::map<std::string, int> mapOfWords;  
  236.     // Inserting data in std::map  
  237.     mapOfWords.insert(std::make_pair("earth", 1));  
  238.     mapOfWords.insert(std::make_pair("moon", 2));  
  239.     mapOfWords["sun"] = 3;  
  240.     // Will replace the value of already added key i.e. earth  
  241.     mapOfWords["earth"] = 4;  
  242.     // Iterate through all elements in std::map  
  243.     std::map<std::string, int>::iterator it = mapOfWords.begin();  
  244.     while (it != mapOfWords.end()) {  
  245.         std::cout << it->first << " :: " << it->second << std::endl;  
  246.         it++;  
  247.     }  
  248.     // Check if insertion is successful or not  
  249.     if (mapOfWords.insert(std::make_pair("earth", 1)).second == false) {  
  250.         std::cout << "Element with key 'earth' not inserted because already existed" << std::endl;  
  251.     }  
  252.     // Searching element in std::map by key.  
  253.     if (mapOfWords.find("sun") != mapOfWords.end())  
  254.         std::cout << "word 'sun' found" << std::endl;  
  255.     if (mapOfWords.find("mars") == mapOfWords.end())  
  256.         std::cout << "word 'mars' not found" << std::endl;  
  257.   
  258.     return 0;  
  259. }  

 

GitHub:https://github.com/fengbingchun/Messy_Test



上一篇: C# winform根据屏幕大小自动缩放   下一篇:C++中的static const