C++ map容器 学习总结
-----------------------------------------------map/multimap容器
map/multimap特性
map相对于set区别,map具有键值和实值,所有元素根据键值自动排序
pair的第一元素被称为键值,第二元素被称为实值
map也是以红黑树作为底层实现机制
同时map与set类似 不能进行迭代器修改键值,但是可以改变实值
而map和multimap区别在于,map不允许相同key值存在,multimap则允许相同的key值存在
-------------map常用API
map构造函数
map<T1,T2> mapTT; map默认构造函数
map(const map& mp); 拷贝构造函数
map赋值操作
map& operator= (const map& mp); 重载=操作符
swap(mp); 交换两个集合容器
map大小操作
size(); 返回容器元素个数
empty(); 判断容器是否为空
map插入数据元素操作
map.insert(...); 往容器里插入元素,并返回pair<iterator,bool>
map<int,string> mapStu;
//第一种 通过pair方式插入对象
mapStu.insert(pair<int,string>(3,"小张"));
//第二种 通过pair方式插入对象
mapStu.insert(make_pair(-1,"小张"));
//第三种 通过value_type的方式插入独享
mapStu.insert(map<int,string>::value_type(1,"小张"));
//第四种 通过数组方式进行插入
mapStu[3] = "小张";
mapStu[5] = "小李";
PS:
1、前三种方法,采用的是insert()方法,该方法返回值为pair<iterator,bool>
2、第四种方法很直观,但存在一个性能问题:插入3时,先在mapStu中查找主键为3的项,若没发现,则将一个键为3
,值为初始化的对组插入到mapStu当中,然后再将值修改成"小张",若发现存在3这个键,则修改这个键对应的value
3、string strName = mapStu[2]; ......取操作和插入操作
只有当mapStu存在2这个键的时候才是正确的取操作,否则将会自动插入一个实例,键为2,值为初始值!!
map删除操作
clear(); 清空
erase(pos); 删除迭代器所指向元素,返回下一个元素迭代器
earse(beg,end); 删除区间所有元素,返回下一个元素的迭代器
earse(key); 删除容器中值为key的元素
map查找和统计
find(key); 查找key是否存在,若存在,返回该键的元素迭代器,若不存在,返回set.end()
count(key); 统计key元素个数(对于map,返回1、0)
lower_bound(keyElem); 返回第一个key>=keyElem的迭代器
upper_bound(keyElem); 返回第一个key>keyElem的迭代器
equal_range(keyElem); 返回容器中key与keyElem想的的上下限的两个迭代器
map排序
1、默认根据key值小->大排序
2、利用仿函数,自定义排序原则(同set)
class cmp {
public:
bool operator() (int v1,int v2) {
return v1 > v2;
}
}
map<int,int,cmp>::iterator
利用迭代器遍历
it->first,it->second
或(*it).first,(*it).second
#include<iostream>
#include<map>
using namespace std;
void test01 () {
//第一个参数key类型,第二个参数value类型
map<int,int> mp;
//插入数据 pair.first key值 pair.second value值
//第一种
pair<map<int,int>::iterator,bool> ret = mp.insert(pair<int,int>(10,10));
if (ret.second) {
cout << "插入成功!" << endl;
}
else {
cout << "插入失败!" << endl;
}
ret = mp.insert(pair<int,int>(10,20));
if (ret.second) {
cout << "插入成功!" << endl;
}
else {
cout << "插入失败!" << endl;
}
//第二种
mp.insert(make_pair(20,20));
//第三种
mp.insert(map<int,int>::value_type(30,30));
//第四种
mp[40] = 40; //若key不存在创建 若存在则修改
mp[10] = 20;
//打印
for (map<int,int>::iterator it = mp.begin();it != mp.end();it ++) {
cout << "key: " << it->first << " value: " << it->second << endl;
}
cout << "mp[60]: " << mp[60] << endl;
for (map<int,int>::iterator it = mp.begin();it != mp.end();it ++) {
cout << "key: " << it->first << " value: " << it->second << endl;
}
//若访问一个key不存在的数据,map将这个访问的key插入到容器,并将value置为默认值
}
C++ map容器 学习总结的更多相关文章
- stl map容器 学习
#include<map> 1.map的声明: map<string,int>map_1; map_1 就是一个string对int的映射. 2.map的用法(映射): map ...
- STL序列式容器学习总结
STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...
- STL之map容器的详解
一.关于map的介绍 map是STL的 一个容器,和set一样,map也是一种关联式容器.它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键 字的值)的数据 ...
- 详解C++ STL map 容器
详解C++ STL map 容器 本篇随笔简单讲解一下\(C++STL\)中的\(map\)容器的使用方法和使用技巧. map容器的概念 \(map\)的英语释义是"地图",但\( ...
- C++ STL 中 map 容器
C++ STL 中 map 容器 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它 ...
- map 容器的使用
C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值. 一.map的说明 1 头文件 #include <map> ...
- 一种map容器遍历的方法
遍历算法是一种很常见而且非常重要的算法,我们用map容器的时候可能用的比较多的是查找,我今天才第一次要用到遍历.下面举个例子就知道了. map<string,string> mp; str ...
- CSU 1113 Updating a Dictionary(map容器应用)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1113 解题报告:输入两个字符串,第一个是原来的字典,第二个是新字典,字典中的元素的格式为 ...
- map容器
map容器一般用于对字符串进行编号,主要用于建图方面,例如把城市名按数字进行编号 #include"stdio.h" #include"string.h" #i ...
- Java集合Map接口与Map.Entry学习
Java集合Map接口与Map.Entry学习 Map接口不是Collection接口的继承.Map接口用于维护键/值对(key/value pairs).该接口描述了从不重复的键到值的映射. (1) ...
随机推荐
- 【Java】常用类
一.String类 java.lang.String类的使用 注意:String可以String s = "";,是因为String类型在后面自动补充了'\0' char初始化不能 ...
- 机器人SLAM导航书重磅来袭
机器人SLAM导航书重磅来袭 互联网和人工智能技术可以看成是对人类大脑的进一步延展,而机器人技术则可以看成是对人类躯体的进一步延展.如果人工智能技术仅仅停留在虚拟的网络和数据之中,那么其挖掘并利用新知 ...
- ubuntu 安装挂载mysql, redis和mongodb服务
因为有两台电脑,所以准备把ubuntu电脑作成对外服务提供,各种数据库,中间件都使用docker安装管理,然后挂载配置和日志到本地,提供给另一台电脑的对外服务. 1. 安装docker sudo ap ...
- markdown常用命令行格式
Markdown 主要命令(语法)如下: 标题 使用 # 号表示标题,# 的个数决定标题的级别: 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 段落 & 换行 直接输入文字形成段 ...
- Robot Framework自定义库的创建于应用(全新库)
场景:新建库文件,库文件内新增方法,用于robot调用执行原始方法内不具备的能力.具体方法图下 1.找到目录C:\Python27\Lib\site-packages 2.新增文件夹"New ...
- 解决 windows 10 WSL 安装Ubuntu后 屏幕亮度飙至最高 且屏幕亮度无法调节 外接显示器无法显示 的问题
转载请注明出处:博客园 博主Bubgit https://www.cnblogs.com/Bubgit/p/16367937.html 问题现象 自从windows 10推出了 wsl (Window ...
- 看过源码吗?说下 Spring 由哪些重要的模块组成?
是的,Spring源码可以深入分析,Spring框架是一个庞大的生态系统,包含多个模块,每个模块都为不同的功能提供支持.以下是Spring的主要模块及其职责: 1. Core Container(核心 ...
- DP学习总结
动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. -----OI Wiki 例.1-最大子段和 分析 DP四步 ⑴定义状态 定义\(dp_i\)表示以\(i\)结尾的最大子段 ...
- Sentinel源码—9.限流算法的实现对比
大纲 1.漏桶算法的实现对比 (1)普通思路的漏桶算法实现 (2)节省线程的漏桶算法实现 (3)Sentinel中的漏桶算法实现 (4)Sentinel中的漏桶算法与普通漏桶算法的区别 (5)Sent ...
- Vue中的APP与js的对象字面量
JavaScript的对象字面量是一种方便创建和初始化对象的语法.它允许您直接在代码中定义对象,而无需使用类或构造函数.对象字面量使用大括号{}括起来,并包含零个或多个键值对. 以下是JavaScri ...