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 ...
随机推荐
- 如何生成动态库 .dll 的符号 .lib 文件?
在知道拥有动态库和头文件的情况下,但没有动态库符号文件的情况下,如何静态链接动态库? 1.使用 Microsoft Visual Studio Tools 命令行命令生成 xxx.def 文件,进而使 ...
- Python-openpyxl操作
from openpyxl import Workbook from openpyxl import load_workbook # 加载workbook,注意,openpyxl只支持xlsx格式 w ...
- [转载]mvc:view-controller
1.重定向 ? 1 <mvc:view-controller path="/" view-name="redirect:/admin/index"/> ...
- make menuconfig 时出现 mixed implicit and normal rules: deprecated syntax
這是 make 的版本問題!不清楚為何要這樣限制? 將此行 config %config: scripts_basic outputmakefile FORCE改成 ...
- Linux centos开机执行JAR Shell脚本
Linux centos开机执行shell脚本 Linux centos开机执行 java jar 1.编写jar执行脚本 vim start.sh 加入如下内容(根据自己真实路径与数据进行编写) ...
- Linux Shell基础 Bash常见命令 history、alias命令以及常用快捷键
概述 shell中常见命令history 历史纪录命令:history 命令格式如下: [root@localhost ~]# history [选项] [历史命令保存文件] -c:清空历史命令: ...
- 【Head First Servlets and JSP】笔记5:HttpServletResponse resp
[HttpServletResponse resp] [由servlet处理响应] 1.一般可以用通过resp获得一个输出流(writer),然后通过输出流将HTML写入响应.例如: resp.set ...
- Sublime Text3 打开文档乱码
一.安装包管理器使用Ctrl+~快捷键或者通过View->Show Console菜单打开命令行,粘贴如下代码 import urllib.request,os; pf = 'Package C ...
- problem-1003(恢复一下)
问题: Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequenc ...
- poj 3126 Bfs
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14539 Accepted: 8196 Descr ...