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 ...
随机推荐
- Mac下最好用的文本编辑器
友情提醒:图多杀猫. 曾经在Windows下一直用gVim.能够用键盘控制一切,操作起来是又快又爽,还支持一大堆插件.想怎么玩就怎么玩.后来转Mac后,也沿袭着之前的习惯.一直在用终端的Vim.偶尔会 ...
- Python 获取文件路径及文件目录
import os print (os.path.dirname(__file__)) print (os.path.abspath(__file__)) print (os.path.abspath ...
- 007-sql整体概述
一.概述 sql基础:数据库.数据表.行.列.关系 查询: Select 字段1,字段2,* from 表 where 条件 去除重复:Distinct 必须放在所有列前面 区间语句:BETWEEN ...
- boost之实用工具
1.noncopyable用于禁止复制和拷贝的类继承.声明拷贝和赋值函数为私有,将运行时的错误转化为编译期的错误. #include <iostream> #include <boo ...
- springboot springmvc 支持 https
Spring Mvc和Spring Boot配置Tomcat支持Https 背景 最近在项目开发中需要让自己的后端Restful接口支持https,在参考了很多前辈们的博客后总结了一些. Spring ...
- Eclipse部署项目的时候抛异常【Multiple Contexts have a path of "/cdcpm".】
Eclipse部署项目的时候抛异常[Multiple Contexts have a path of "/cdcpm".]重新clean .删除server都不好使.查看一下tom ...
- Dancing Link专题
一些链接: http://www.cnblogs.com/-sunshine/p/3358922.html http://www.cnblogs.com/grenet/p/3145800.html 1 ...
- Bootstrap入门教程
资料来源: http://www.cnblogs.com/ventlam/archive/2012/05/28/2520703.html 1.全局样式:Bootstrap要求html5的文件类型,所以 ...
- echarts3.8.4实现城市空气质量(结合百度地图bmap.js,小航哥)
(小航哥自己实现的)为了事先地图效果,需要以下准备: 用百度地图作为地图,需要 1.bmap.min.js(下载地址https://github.com/ecomfe/echarts ,GitHub上 ...
- 转:Windows下USB接口驱动技术(二)