该文档举例说明了multimap的查找和删除元素的使用
该文档举例说明了multimap的查找和删除元素的使用。
其中,在使用迭代器遍历元素的时候,如果使用了删除迭代器的操作,那么需要小心迭代器失效的情况。
/*
功能说明:
multimap的查找和删除元素的使用举例
代码说明:
使用multimap的equal_range()方法来查找符合指定key的元素。使用erase来删除指定key的元素。
实现方式:
限制条件或者存在的问题:
无
*/ #include <iostream>
#include <string>
#include <map> using namespace std; class CData
{
public:
CData()
{
sequence = ;
this->remark = "default string"; cout << "CData()\t" << toString() << "\t" << endl;
} CData(int i, string &s)
{
this->sequence = i;
this->remark = s; cout << "CData(int i,string &s)\t" << toString() << "\t" << endl;
} CData(const CData &data)
{
this->sequence = data.sequence;
this->remark = data.remark; cout << "CData(const CData &data)\t" << toString() << "\t" << endl;
} CData operator = (const CData &data)
{
this->sequence = data.sequence;
this->remark = data.remark; cout << "CData operator = (const CData &data)\t" << toString() << "\t" << endl; return *this;
} void setSequence(const int i)
{
this->sequence = i;
} void setRemark(const string &s)
{
this->remark = s;
} string toString() const
{
char tmp[] = { };
sprintf(tmp, "[sequence:%d | remark:%s @ %p]", this->sequence, this->remark.c_str(),this); //此处应该有内存复制操作,所以不用担心返回后tmp数组所指向的内存被修改或者不存在的情况。
return tmp;
} ~CData()
{
cout << "~CData()\t" << this << endl;
}
protected:
private:
int sequence;
string remark;
}; int main(int argc, char ** argv)
{
cout << "process begin @[" << (void*)&main << "]" << endl; multimap<string, CData *> multData;
string strClassName = "CData11";
CData *p11 = new CData(, strClassName);
strClassName = "CData12";
CData *p12 = new CData(, strClassName);
strClassName = "CData13";
CData *p13 = new CData(, strClassName);
strClassName = "CData23";
CData *p23 = new CData(, strClassName);
strClassName = "CData24";
CData *p24 = new CData(, strClassName);
strClassName = "CData26";
CData *p26 = new CData(, strClassName); multData.insert(make_pair("", p11));
multData.insert(make_pair("", p23));
multData.insert(make_pair("", p13));
multData.insert(make_pair("", p24));
multData.insert(make_pair("", p12));
multData.insert(make_pair("", p26)); cout << "multData.size()\t" << multData.size() << endl; cout << "show all msg" << endl;
// multimap在创建的时候,已经将元素根据key的顺序排好了(前提是key支持<比较)。
for (multimap<string, CData*>::iterator itr = multData.begin(); itr != multData.end(); itr++)
{
cout << itr->first << "\t" << (itr->second)->toString() << endl;
} cout << "find 2" << endl;
pair<multimap<string, CData*>::iterator, multimap<string, CData*>::iterator> pitr2 = multData.equal_range("");
for (multimap<string, CData*>::iterator itr = pitr2.first; itr != pitr2.second; itr++)
{
cout << itr->first << "\t" << (itr->second)->toString() << endl;
} multData.erase(""); pitr2 = multData.equal_range("");
if (pitr2.first == pitr2.second)
{
cout << "can not find key 2 after delete key 2" << endl;
} cout << "show all msg after delete 2" << endl;
for (multimap<string, CData*>::iterator itr = multData.begin(); itr != multData.end(); itr++)
{
cout << itr->first << "\t" << (itr->second)->toString() << endl;
} multData.insert(make_pair("", p11));
multData.insert(make_pair("", p23));
multData.insert(make_pair("", p13));
multData.insert(make_pair("", p24));
multData.insert(make_pair("", p12));
multData.insert(make_pair("", p26)); cout << "find element by key using another way" << endl;
for (multimap<string, CData*>::iterator itr_find = multData.lower_bound(""); itr_find != multData.upper_bound(""); itr_find++)
{
cout << itr_find->first << "\t" << (itr_find->second)->toString() << endl;
} cout << "delete key 1 by iterator" << endl;
// 这是一种错误的迭代器删除元素的方式。
/*
for (multimap<string, CData*>::iterator itr = multData.begin(); itr != multData.end(); itr++)
{
cout << itr->first << "\t" << (itr->second)->toString() << endl;
if (itr->first == "1")
{
multData.erase(itr);
}
}
*/ // 正确的使用迭代器删除元素的方式。
for (multimap<string, CData*>::iterator itr = multData.begin(); itr != multData.end(); )
{
if (itr->first == "")
{
cout <<"find key 1. "<< itr->first << "\t" << (itr->second)->toString() << endl;
itr = multData.erase(itr);
}
else
{
cout << "can not find key 1. " << itr->first << "\t" << (itr->second)->toString() << endl;
itr++;
}
} cout << "show all msg after erase key 1" << endl;
for (multimap<string, CData*>::iterator itr = multData.begin(); itr != multData.end(); itr++)
{
cout << itr->first << "\t" << (itr->second)->toString() << endl;
} delete p11;
delete p12;
delete p13;
delete p23;
delete p24;
delete p26; return ;
}
程序的输出结果:
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的查找和删除元素的使用的更多相关文章
- ELK学习总结(2-4)bulk 批量操作-实现多个文档的创建、索引、更新和删除
bulk 批量操作-实现多个文档的创建.索引.更新和删除 ----------------------------------------------------------------------- ...
- 慧自文档:代替 Everything 来快速查找文件的,实现文件显示在文件夹的层次结构中
1. 搜索功能和Everything一样快和强大 具有 Everything 搜索快.搜索功能强等优点, 解决了不能方便选择搜索哪个文件夹, 解决了不能同一个画面进行预览等问题 2.文件直接显示到文件 ...
- 用Java对xml文档进行遍历,更新,创建,删除
import java.io.File;import java.io.FileInputStream; import javax.imageio.stream.FileImageInputStream ...
- jquery 追加元素/jquery文档处理,插入、修改、移动、删除指定的DOM元素.
jquery 追加元素 $("#content").append("..."); // 添加到元素内部最后面 $("#content").p ...
- pytest文档40-pytest.ini配置用例查找规则(面试题)
前言 面试题:pytest如何执行不是test开头的用例?如执行 xxx_*.py这种文件的用例. pytest.ini 配置文件可以修改用例的匹配规则. pytest命令行参数 cmd打开输入pyt ...
- HTML DOCTYPE文档类型举例说明
HTML DOCTYPE文档类型举例说明 HTML4.01文档过渡定义类型,此类型定义的文档可以使用HTML中的标签与元素包括一些不被W3C推荐的标签(例如:font.b等),不可以使用框架 < ...
- DOM (Document Object Model)文档对象模型
[理解下DOM] DOM——Document Object Mode.DOM是网页上XHTML中文档正文标题啊.段落.列表.样式.以及ID/class等所有其他数据的一个内部表示.我自己的理解是将网页 ...
- css3学习文档
什么是CSS3? CSS3是CSS2的升级版本,3只是版本号,它在CSS2.1的基础上增加了很多强大的新功能. 目前主流浏览器chrome.safari.firefox.opera.甚至360都已经支 ...
- HTML5的文档结构
HTML5的文档结构 HTML5简化了许多,它的设计遵循了3个原则:1.兼容性.2.实用性.3.通用访问性 1. header 元素 <header> 标签定义文档或者文档 ...
随机推荐
- for 循环与嵌套
循环:反复执行某段代码.循环四要素:初始条件,循环条件,循环体,状态改变 for(初始条件;循环条件;状态改变){ 循环体} 给出初始条件,先判断是否满足循环条件,如果不满足条件则跳过for语句,如果 ...
- 使用Vue.js初次真正项目开发-2018/07/14
一.组件化 使用Vue.js进行开发,按照MVVM模式,围绕数据为核心,进行开发. 开发过程根据业务和功能组件化,组件化一方面让我们开发思路更加清晰,另一方面对于数据的处理和控制变得更加简单,毕竟一个 ...
- Sybase:获取本月最后一天的日期的实现方法
Sybase:获取本月最后一天的日期的实现方法 Oracle中查询月底那天的日期的函数为:last_day(). 在ASE中没有对应的函数,在Oracle移植到Sybase的时候,需要手动编写函数来实 ...
- 20145229吴姗珊《网络对抗》WEB基础实践
20145229吴姗珊<网络对抗>WEB基础实践 基础与实践 基础问题 1.什么是表单 表单是可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 一部分是HTML源代码用于 ...
- iOS日常学习 - iOS10上关于NSPhotoLibraryUsageDescription等问题
最近升级了Xcode8.0,真是很多坑啊,填完一个来另外一个,今天又遇到了一个,用Xcode8.0上传项目时被驳回说是info.plist里面没有设置NSPhotoLibraryUsageDescri ...
- centos7 -lvm卷组
老忘,记一下 基本的逻辑卷管理概念: PV(Physical Volume)- 物理卷 物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘,也可以是raid设备. ...
- Mac安装搭建sublimeText3开发Nodejs环境
原文] [基本环境 安装Nodejs 这个直接就可以去官网下载就可以了.Nodejs官网 根据自己的PC系统类型选择对应的版本下载之后就可以了. 安装SublimeText3 这个也是直接去Subli ...
- JAVA中的数据存储(堆及堆栈)- 转载
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可 ...
- js中object的copy
一.场景 在js中一个对象(Object)或者是一个数组(Array)在复制的过程中往往不是特别的简单,一般情况下我们会直接将其赋值给另外一个变量名下,就像这样: var a = [1,2,3]; v ...
- 腾讯开源手游热更新方案,Unity3D下的Lua编程
原文:http://www.sohu.com/a/123334175_355140 作者|车雄生 编辑|木环 腾讯最近在开源方面的动作不断:先是微信跨平台基础组件Mars宣布开源,腾讯手游又于近期开源 ...