该文档举例说明了multimap的查找和删除元素的使用。

其中,在使用迭代器遍历元素的时候,如果使用了删除迭代器的操作,那么需要小心迭代器失效的情况。

  1. /*
  2. 功能说明:
  3. multimap的查找和删除元素的使用举例
  4. 代码说明:
  5. 使用multimap的equal_range()方法来查找符合指定key的元素。使用erase来删除指定key的元素。
  6. 实现方式:
  7. 限制条件或者存在的问题:

  8. */
  9.  
  10. #include <iostream>
  11. #include <string>
  12. #include <map>
  13.  
  14. using namespace std;
  15.  
  16. class CData
  17. {
  18. public:
  19. CData()
  20. {
  21. sequence = ;
  22. this->remark = "default string";
  23.  
  24. cout << "CData()\t" << toString() << "\t" << endl;
  25. }
  26.  
  27. CData(int i, string &s)
  28. {
  29. this->sequence = i;
  30. this->remark = s;
  31.  
  32. cout << "CData(int i,string &s)\t" << toString() << "\t" << endl;
  33. }
  34.  
  35. CData(const CData &data)
  36. {
  37. this->sequence = data.sequence;
  38. this->remark = data.remark;
  39.  
  40. cout << "CData(const CData &data)\t" << toString() << "\t" << endl;
  41. }
  42.  
  43. CData operator = (const CData &data)
  44. {
  45. this->sequence = data.sequence;
  46. this->remark = data.remark;
  47.  
  48. cout << "CData operator = (const CData &data)\t" << toString() << "\t" << endl;
  49.  
  50. return *this;
  51. }
  52.  
  53. void setSequence(const int i)
  54. {
  55. this->sequence = i;
  56. }
  57.  
  58. void setRemark(const string &s)
  59. {
  60. this->remark = s;
  61. }
  62.  
  63. string toString() const
  64. {
  65. char tmp[] = { };
  66. sprintf(tmp, "[sequence:%d | remark:%s @ %p]", this->sequence, this->remark.c_str(),this);
  67.  
  68. //此处应该有内存复制操作,所以不用担心返回后tmp数组所指向的内存被修改或者不存在的情况。
  69. return tmp;
  70. }
  71.  
  72. ~CData()
  73. {
  74. cout << "~CData()\t" << this << endl;
  75. }
  76. protected:
  77. private:
  78. int sequence;
  79. string remark;
  80. };
  81.  
  82. int main(int argc, char ** argv)
  83. {
  84. cout << "process begin @[" << (void*)&main << "]" << endl;
  85.  
  86. multimap<string, CData *> multData;
  87. string strClassName = "CData11";
  88. CData *p11 = new CData(, strClassName);
  89. strClassName = "CData12";
  90. CData *p12 = new CData(, strClassName);
  91. strClassName = "CData13";
  92. CData *p13 = new CData(, strClassName);
  93. strClassName = "CData23";
  94. CData *p23 = new CData(, strClassName);
  95. strClassName = "CData24";
  96. CData *p24 = new CData(, strClassName);
  97. strClassName = "CData26";
  98. CData *p26 = new CData(, strClassName);
  99.  
  100. multData.insert(make_pair("", p11));
  101. multData.insert(make_pair("", p23));
  102. multData.insert(make_pair("", p13));
  103. multData.insert(make_pair("", p24));
  104. multData.insert(make_pair("", p12));
  105. multData.insert(make_pair("", p26));
  106.  
  107. cout << "multData.size()\t" << multData.size() << endl;
  108.  
  109. cout << "show all msg" << endl;
  110. // multimap在创建的时候,已经将元素根据key的顺序排好了(前提是key支持<比较)。
  111. for (multimap<string, CData*>::iterator itr = multData.begin(); itr != multData.end(); itr++)
  112. {
  113. cout << itr->first << "\t" << (itr->second)->toString() << endl;
  114. }
  115.  
  116. cout << "find 2" << endl;
  117. pair<multimap<string, CData*>::iterator, multimap<string, CData*>::iterator> pitr2 = multData.equal_range("");
  118. for (multimap<string, CData*>::iterator itr = pitr2.first; itr != pitr2.second; itr++)
  119. {
  120. cout << itr->first << "\t" << (itr->second)->toString() << endl;
  121. }
  122.  
  123. multData.erase("");
  124.  
  125. pitr2 = multData.equal_range("");
  126. if (pitr2.first == pitr2.second)
  127. {
  128. cout << "can not find key 2 after delete key 2" << endl;
  129. }
  130.  
  131. cout << "show all msg after delete 2" << endl;
  132. for (multimap<string, CData*>::iterator itr = multData.begin(); itr != multData.end(); itr++)
  133. {
  134. cout << itr->first << "\t" << (itr->second)->toString() << endl;
  135. }
  136.  
  137. multData.insert(make_pair("", p11));
  138. multData.insert(make_pair("", p23));
  139. multData.insert(make_pair("", p13));
  140. multData.insert(make_pair("", p24));
  141. multData.insert(make_pair("", p12));
  142. multData.insert(make_pair("", p26));
  143.  
  144. cout << "find element by key using another way" << endl;
  145. for (multimap<string, CData*>::iterator itr_find = multData.lower_bound(""); itr_find != multData.upper_bound(""); itr_find++)
  146. {
  147. cout << itr_find->first << "\t" << (itr_find->second)->toString() << endl;
  148. }
  149.  
  150. cout << "delete key 1 by iterator" << endl;
  151. // 这是一种错误的迭代器删除元素的方式。
  152. /*
  153. for (multimap<string, CData*>::iterator itr = multData.begin(); itr != multData.end(); itr++)
  154. {
  155. cout << itr->first << "\t" << (itr->second)->toString() << endl;
  156. if (itr->first == "1")
  157. {
  158. multData.erase(itr);
  159. }
  160. }
  161. */
  162.  
  163. // 正确的使用迭代器删除元素的方式。
  164. for (multimap<string, CData*>::iterator itr = multData.begin(); itr != multData.end(); )
  165. {
  166. if (itr->first == "")
  167. {
  168. cout <<"find key 1. "<< itr->first << "\t" << (itr->second)->toString() << endl;
  169. itr = multData.erase(itr);
  170. }
  171. else
  172. {
  173. cout << "can not find key 1. " << itr->first << "\t" << (itr->second)->toString() << endl;
  174. itr++;
  175. }
  176. }
  177.  
  178. cout << "show all msg after erase key 1" << endl;
  179. for (multimap<string, CData*>::iterator itr = multData.begin(); itr != multData.end(); itr++)
  180. {
  181. cout << itr->first << "\t" << (itr->second)->toString() << endl;
  182. }
  183.  
  184. delete p11;
  185. delete p12;
  186. delete p13;
  187. delete p23;
  188. delete p24;
  189. delete p26;
  190.  
  191. return ;
  192. }

程序的输出结果:

process begin @[00B2188E]
CData(int i,string &s)  [sequence:11 | remark:CData11 @ 011FCFD0]
CData(int i,string &s)  [sequence:12 | remark:CData12 @ 011FD020]
CData(int i,string &s)  [sequence:13 | remark:CData13 @ 011FD8C0]
CData(int i,string &s)  [sequence:23 | remark:CData23 @ 011FE448]
CData(int i,string &s)  [sequence:24 | remark:CData24 @ 011FE6C8]
CData(int i,string &s)  [sequence:26 | remark:CData26 @ 011FE808]
multData.size() 6
show all msg
1       [sequence:11 | remark:CData11 @ 011FCFD0]
1       [sequence:13 | remark:CData13 @ 011FD8C0]
1       [sequence:12 | remark:CData12 @ 011FD020]
2       [sequence:23 | remark:CData23 @ 011FE448]
2       [sequence:24 | remark:CData24 @ 011FE6C8]
2       [sequence:26 | remark:CData26 @ 011FE808]
find 2
2       [sequence:23 | remark:CData23 @ 011FE448]
2       [sequence:24 | remark:CData24 @ 011FE6C8]
2       [sequence:26 | remark:CData26 @ 011FE808]
can not find key 2 after delete key 2
show all msg after delete 2
1       [sequence:11 | remark:CData11 @ 011FCFD0]
1       [sequence:13 | remark:CData13 @ 011FD8C0]
1       [sequence:12 | remark:CData12 @ 011FD020]
find element by key using another way
1       [sequence:11 | remark:CData11 @ 011FCFD0]
1       [sequence:13 | remark:CData13 @ 011FD8C0]
1       [sequence:12 | remark:CData12 @ 011FD020]
1       [sequence:11 | remark:CData11 @ 011FCFD0]
1       [sequence:13 | remark:CData13 @ 011FD8C0]
1       [sequence:12 | remark:CData12 @ 011FD020]
delete  key 1 by iterator
find key 1. 1   [sequence:11 | remark:CData11 @ 011FCFD0]
find key 1. 1   [sequence:13 | remark:CData13 @ 011FD8C0]
find key 1. 1   [sequence:12 | remark:CData12 @ 011FD020]
find key 1. 1   [sequence:11 | remark:CData11 @ 011FCFD0]
find key 1. 1   [sequence:13 | remark:CData13 @ 011FD8C0]
find key 1. 1   [sequence:12 | remark:CData12 @ 011FD020]
can not find key 1. 2   [sequence:23 | remark:CData23 @ 011FE448]
can not find key 1. 2   [sequence:24 | remark:CData24 @ 011FE6C8]
can not find key 1. 2   [sequence:26 | remark:CData26 @ 011FE808]
show all msg after erase key 1
2       [sequence:23 | remark:CData23 @ 011FE448]
2       [sequence:24 | remark:CData24 @ 011FE6C8]
2       [sequence:26 | remark:CData26 @ 011FE808]
~CData()        011FCFD0
~CData()        011FD020
~CData()        011FD8C0
~CData()        011FE448
~CData()        011FE6C8
~CData()        011FE808

该文档举例说明了multimap的查找和删除元素的使用的更多相关文章

  1. ELK学习总结(2-4)bulk 批量操作-实现多个文档的创建、索引、更新和删除

    bulk 批量操作-实现多个文档的创建.索引.更新和删除 ----------------------------------------------------------------------- ...

  2. 慧自文档:代替 Everything 来快速查找文件的,实现文件显示在文件夹的层次结构中

    1. 搜索功能和Everything一样快和强大 具有 Everything 搜索快.搜索功能强等优点, 解决了不能方便选择搜索哪个文件夹, 解决了不能同一个画面进行预览等问题 2.文件直接显示到文件 ...

  3. 用Java对xml文档进行遍历,更新,创建,删除

    import java.io.File;import java.io.FileInputStream; import javax.imageio.stream.FileImageInputStream ...

  4. jquery 追加元素/jquery文档处理,插入、修改、移动、删除指定的DOM元素.

    jquery 追加元素 $("#content").append("..."); // 添加到元素内部最后面 $("#content").p ...

  5. pytest文档40-pytest.ini配置用例查找规则(面试题)

    前言 面试题:pytest如何执行不是test开头的用例?如执行 xxx_*.py这种文件的用例. pytest.ini 配置文件可以修改用例的匹配规则. pytest命令行参数 cmd打开输入pyt ...

  6. HTML DOCTYPE文档类型举例说明

    HTML DOCTYPE文档类型举例说明 HTML4.01文档过渡定义类型,此类型定义的文档可以使用HTML中的标签与元素包括一些不被W3C推荐的标签(例如:font.b等),不可以使用框架 < ...

  7. DOM (Document Object Model)文档对象模型

    [理解下DOM] DOM——Document Object Mode.DOM是网页上XHTML中文档正文标题啊.段落.列表.样式.以及ID/class等所有其他数据的一个内部表示.我自己的理解是将网页 ...

  8. css3学习文档

    什么是CSS3? CSS3是CSS2的升级版本,3只是版本号,它在CSS2.1的基础上增加了很多强大的新功能. 目前主流浏览器chrome.safari.firefox.opera.甚至360都已经支 ...

  9. HTML5的文档结构

    HTML5的文档结构 HTML5简化了许多,它的设计遵循了3个原则:1.兼容性.2.实用性.3.通用访问性     1. header 元素     <header> 标签定义文档或者文档 ...

随机推荐

  1. HDU - 6397 Character Encoding 2018 Multi-University Training Contest 8 (容斥原理)

    题意:问有多少种不重复的m个数,值在[0,n-1]范围内且和为k. 分析:当k<=n-1时,肯定不会有盒子超过n,结果是C(m+k-1,k):当k>m*(n-1)时,结果是0. 剩下的情况 ...

  2. Xcode 解决日志打印不全问题

    Xcode 出了8.0后,代码运行日志过长时会出现打印不全的问题. 这可能是Xcode优化的一项,不过这也给开发带来的不必要的麻烦.下面的宏定义可以解决这一问题. #ifdef DEBUG #defi ...

  3. master: Error: JAVA_HOME is not set and could not be found.问题解决

  4. SVN如何切换用户对代码进行操作

    在使用svn更新或提交数据时需要输入用户名和密码,在输入框中可以选择是否记录,以便下次操作无需再次输入用户名和密码: 要切换其他用户名时,需要删除已记录用户的数据,在电脑桌面上右击,依次点击菜单项To ...

  5. alter table add constraint 用法

    1.主键约束: 要对一个列加主键约束的话,这列就必须要满足的条件就是分空 因为主键约束:就是对一个列进行了约束,约束为(非空.不重复) 以下是代码   要对一个列加主键,列名为id,表名为emp 格式 ...

  6. CF335B

    /*CF335B 这个题目的n达到50000,但是串只是有小写字母组成,所以如果字符串的长度大于2600,那么 肯定存在,所开始输入就判断如果长度大于2600,那么直接找当个字母输出100个 否则执行 ...

  7. java处理图片base64编码的相互转换

    转载自http://www.cnblogs.com/libra0920/p/5754356.html 直接上代码 import sun.misc.BASE64Decoder; import sun.m ...

  8. Kubernetes学习整理

    修改镜像仓库 官方提供的时google源,显然是无法使用的.这里需要改成国内的源 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kube ...

  9. Python中有趣的数据结构

    链表 链表的基本操作 >>> a = [66.25,333,333,1,1234.5] >>> print a.count(333),a.count(66.25), ...

  10. Python连接MongoDB操作

    1.安装PyMongo 注意:请勿安装“bson”软件包. PyMongo配有自己的bson包; 执行“pip install bson”或“easy_install bson”则会安装与PyMong ...