标准库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的插入、查找、删除的更多相关文章

  1. HDU 5687 字典树插入查找删除

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 #include< ...

  2. JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能

    主要内容:  JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十 ...

  3. 二叉查找树的查找、插入和删除 - Java实现

    http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 作者: yangecnu(yangecnu's Blog on ...

  4. 二叉搜索树Java实现(查找、插入、删除、遍历)

    由于最近想要阅读下 JDK1.8 中 HashMap 的具体实现,但是由于 HashMap 的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出- ...

  5. 算法与数据结构(十) 二叉排序树的查找、插入与删除(Swift版)

    在上一篇博客中,我们主要介绍了四种查找的方法,包括顺序查找.折半查找.插入查找以及Fibonacci查找.上面这几种查找方式都是基于线性表的查找方式,今天博客中我们来介绍一下基于二叉树结构的查找,也就 ...

  6. 【算法】【python实现】二叉搜索树插入、删除、查找

    二叉搜索树 定义:如果一颗二叉树的每个节点对应一个关键码值,且关键码值的组织是有顺序的,例如左子节点值小于父节点值,父节点值小于右子节点值,则这棵二叉树是一棵二叉搜索树. 类(TreeNode):定义 ...

  7. arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新

    风过无痕 原文  arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 1.查找数据Search Cu ...

  8. 二叉查找树(查找、插入、删除)——C语言

    二叉查找树 二叉查找树(BST:Binary Search Tree)是一种特殊的二叉树,它改善了二叉树节点查找的效率.二叉查找树有以下性质: (1)若左子树不空,则左子树上所有节点的值均小于它的根节 ...

  9. AVL树(查找、插入、删除)——C语言

    AVL树 平衡二叉查找树(Self-balancing binary search tree)又被称为AVL树(AVL树是根据它的发明者G. M. Adelson-Velskii和E. M. Land ...

随机推荐

  1. Web 框架本质解析

    一  Web框架本质 1. 自己开发Web框架 - socket - http协议 - HTML知识 - 数据库(pymysql,SQLAlchemy) HTTP: 无状态.短连接 TCP: 不断开 ...

  2. 2、Python request、BeautifulSoup(download mm_pic)

    import requests from bs4 import BeautifulSoup import os class DownLoadImg(object): def __init__(self ...

  3. create ‘/.git/index.lock’: File exists.

    Git – fatal: Unable to create ‘/.git/index.lock’: File exists. fatal: Unable to create ‘/path/my_pro ...

  4. 转载:阮一峰 RESTful API设计指南

    阮一峰先生的文章对我理解启发很大,转载到我的博客 http://www.ruanyifeng.com/blog/2014/05/restful_api.html 网络应用程序,分为前端和后端两个部分. ...

  5. javascript高级语法

    一.JavaScript对象 1.js对象简介 1.1 在JavaScript中除了null和undefined以外其他的数据类型都被定义成了对象,也可以用创建对象的方法定义变量,在JavaScrip ...

  6. 流量分析系统----实现-echarts模拟迁移(bmap.js/china.js)

    china.js: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  7. c# 泛型(Generic)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 泛型 { ...

  8. 微信小程序相关资料整理

    微信小程序官方介绍https://mp.weixin.qq.com/debug/wxadoc/introduction/index.html?t=201818 微信小程序开发资源https://jue ...

  9. Django---view视图FBV&CBV

    一:创建项目和应用: 或者用命令创建: 1:django-admin.py startproject CBV&FBV 2: cd CBV&FBV (路径切到该文件夹下) 3: pyth ...

  10. jQuery可放大预览的图片滑块

    在线演示 本地下载