C++(十一)— map的插入、查找、删除
标准库map类型是一种以键-值(key-value)存储的数据类型。
map是STL的一个关联容器。它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。
1、map特点
map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。
自动建立Key - value的对应。key 和 value可以是任意你需要的类型。
根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
快速插入Key -Value 记录。快速删除记录,根据Key 修改value记录。遍历所有记录。
2、map对象的一些基本操作
因此,若只是查找该元素是否存在,可以使用函数count(k),该函数返回的是k出现的次数;若是想取得key对应的值,可以使用函数find(k),该函数返回的是指向该元素的迭代器。
第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了
第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。
查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.
map<char, int> p;
//map中插入元素
// method_1
p.insert(make_pair('a', ));
p.insert(make_pair('b', ));
// method_2
p.insert(pair<char, int>('c', ));
p.insert(pair<char, int>('d', ));
//method_3
p.insert(map<char, int>::value_type('e', ));
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include <vector>
#include<string>
#include<map>
using namespace std; int main()
{
map<char, int> p;
//map中插入元素
p.insert(make_pair('a',));
p.insert(make_pair('c', ));
p.insert(make_pair('b', ));
//采用下标的方法读取map中元素时,若map中不存在该元素,则会在map中插入。
//p['y'] = 17;
//p['f'] = 11; map<char, int>::iterator it;
for (it = p.begin(); it != p.end(); it++)
cout << (*it).first << " " << (*it).second << endl; /*用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,
由于map的特性,一对一的映射关系,
就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了*/
if (p.count('b'))
{
//返回出现次数,0或者1.
cout << p.count('b') << endl;
} //用find函数来定位数据出现位置,它返回的一个迭代器
map<char, int>::iterator iter;
iter = p.find('b');
if (iter != p.end())
cout << "Find, the value is " << (*iter).second << endl;
else
cout << "Do not Find" << endl; system("pause");
return ;
}
遍历map中的内容:使用迭代器的方法、使用指针的方法
map<string, int>::iterator iter;
for (iter = name_score_map.begin(); iter != name_score_map.end(); ++iter) {
cout << (*iter).first << endl;
}
for (const auto& iter : name_score_map)
cout << iter.first << "\t" << iter.second << endl;
删除元素方法。
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include <vector>
#include<string>
#include<map>
using namespace std; int main()
{
map<char, int> p;
//map中插入元素
p.insert(make_pair('a',));
p.insert(make_pair('c', ));
p.insert(make_pair('b', ));
//采用下标的方法读取map中元素时,若map中不存在该元素,则会在map中插入。
//p['y'] = 17;
//p['f'] = 11; map<char, int>::iterator it;
for (it = p.begin(); it != p.end(); it++)
cout << (*it).first << " " << (*it).second << endl; //如果你要演示输出效果,请选择以下的一种,你看到的效果会比较好
//如果要删除1,用迭代器删除
map<char, int>::iterator iter;
iter = p.find();
p.erase(iter);
//如果要删除1,用关键字删除
int n = p.erase();//如果删除了会返回1,否则返回0
//用迭代器,成片的删除 一下代码把整个map清空
p.erase(p.begin(), p.end());
//成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合
//自个加上遍历代码,打印输出吧 system("pause");
return ;
}
equal_range的用法
map<char, int> p;
//map中插入元素
// method_1
p.insert(make_pair('a', ));
p.insert(make_pair('a', ));
// method_2
p.insert(pair<char, int>('a', ));
p.insert(pair<char, int>('a', ));
//method_3
p.insert(map<char, int>::value_type('a', )); //equal_range
pair<map<char, int>::iterator, map<char, int>::iterator> mypair = p.equal_range('a');
if (mypair.first != p.end())
{
cout << mypair.first->first << "\t" << mypair.first->second << endl;
}
else
{
cout << "第一个迭代器 >=c 的位置不存在" << endl;
} if (mypair.second != p.end())
{
cout << mypair.second->first << "\t" << mypair.second->second << endl;
}
else
{
cout << "第二个迭代器 >c 的位置不存在" << endl;
}
输出结果:(由于不存在大于 a的迭代器,所以第二个找不到)

C++(十一)— map的插入、查找、删除的更多相关文章
- HDU 5687 字典树插入查找删除
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 #include< ...
- JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能
主要内容: JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十 ...
- 二叉查找树的查找、插入和删除 - Java实现
http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 作者: yangecnu(yangecnu's Blog on ...
- 二叉搜索树Java实现(查找、插入、删除、遍历)
由于最近想要阅读下 JDK1.8 中 HashMap 的具体实现,但是由于 HashMap 的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出- ...
- 算法与数据结构(十) 二叉排序树的查找、插入与删除(Swift版)
在上一篇博客中,我们主要介绍了四种查找的方法,包括顺序查找.折半查找.插入查找以及Fibonacci查找.上面这几种查找方式都是基于线性表的查找方式,今天博客中我们来介绍一下基于二叉树结构的查找,也就 ...
- 【算法】【python实现】二叉搜索树插入、删除、查找
二叉搜索树 定义:如果一颗二叉树的每个节点对应一个关键码值,且关键码值的组织是有顺序的,例如左子节点值小于父节点值,父节点值小于右子节点值,则这棵二叉树是一棵二叉搜索树. 类(TreeNode):定义 ...
- arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新
风过无痕 原文 arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 1.查找数据Search Cu ...
- 二叉查找树(查找、插入、删除)——C语言
二叉查找树 二叉查找树(BST:Binary Search Tree)是一种特殊的二叉树,它改善了二叉树节点查找的效率.二叉查找树有以下性质: (1)若左子树不空,则左子树上所有节点的值均小于它的根节 ...
- AVL树(查找、插入、删除)——C语言
AVL树 平衡二叉查找树(Self-balancing binary search tree)又被称为AVL树(AVL树是根据它的发明者G. M. Adelson-Velskii和E. M. Land ...
随机推荐
- JS判断是手机访问还是PC端访问网站
<script> if ((navigator.userAgent.match(/(iPhone|iPod|Android|ios|iOS|iPad|Backerry|WebOS|S ...
- 74LS85 比較器 【数字电路】
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011368821/article/details/27959219 74LS85 demo: 11 ...
- Junit单元测试注入spring中的bean(转载)
转载自:http://blog.csdn.net/cy104204/article/details/51076678 一般对于有bean注入的类进行方法单元测试时,会发现bean对象并没有注入进来,对 ...
- Android Studio工程引用第三方so文件
应用程序二进制接口(Application Binary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库.在Androi ...
- 我的第一个Python小程序
猜年龄,如果大了提示小点,如果小了,提示大点 涉及的知识点: 1.变量 2.注释 3.接收交互式的输入 4.类型转换 5.while循环 6.if..elif..else多条件分支语句 # Autho ...
- openstack ocata版(脚本)计算节点安装
一.初始化环境: 1.安装软件包: yum -y install centos-release-openstack-ocata yum -y upgrade yum -y install python ...
- css系列(6)css的运用(二)
本节继续介绍css在html页面重的应用实例. (1)div的border-style属性: none: 无样式 hidden: 除了同表格的边框发生冲突的时候,其它同none dot ...
- <script>放在head内和body内有什么区别
加载的顺序不一样,你可以把HTML看成从上往下加载的. 例如在网速慢的情况下把js代码放在body底部用户会先看到网页结构,等js加载完成后才出现特效 区别简述: 在HTML body部分中的Java ...
- qnx 黑莓系统
qnx 黑莓图形系统框架 http://www.360doc.com/content/07/0807/10/38907_658192.shtml http://blog.csdn.net/keyboa ...
- LVS/NAT 配置
LVS/NAT 配置 实验环境 三台主机:Linux Centos 6.4 32位 调度器Director:192.168.1.160(内网IP).192.168.2.20(公网IP) HTTP真实服 ...