转载:https://blog.csdn.net/shuzfan/article/details/53115922

C++中map提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在map中出现一次;第二个称之为该关键字的对应值。

一. 声明

 //头文件
#include<map>
map<int, string> ID_Name; // 使用{}赋值是从c++11开始的,因此编译器版本过低时会报错,如visual studio 2012
map<int, string> ID_Name = {
  { , "Jim" },
  { , "Tom" },
  { , "Bob" }
 };

二. 插入操作
2.1 使用[ ]进行单个插入

 map<int, string> ID_Name;

 // 如果已经存在键值2015,则会作赋值修改操作,如果没有则插入
ID_Name[] = "Tom";

2.1 使用insert进行单个和多个插入
insert共有4个重载函数:

// 插入单个键值对,并返回插入位置和成功标志,插入位置已经存在值时,插入失败
pair<iterator,bool> insert (const value_type& val); //在指定位置插入,在不同位置插入效率是不一样的,因为涉及到重排
iterator insert (const_iterator position, const value_type& val); // 插入多个
void insert (InputIterator first, InputIterator last); //c++11开始支持,使用列表插入多个
void insert (initializer_list<value_type> il);

下面是具体使用示例:

#include <iostream>
#include <map> int main()
{
std::map<char, int> mymap; // 插入单个值
mymap.insert(std::pair<char, int>('a', ));
mymap.insert(std::pair<char, int>('z', )); //返回插入位置以及是否插入成功
std::pair<std::map<char, int>::iterator, bool> ret;
ret = mymap.insert(std::pair<char, int>('z', ));
if (ret.second == false) {
std::cout << "element 'z' already existed";
std::cout << " with a value of " << ret.first->second << '\n';
} //指定位置插入
std::map<char, int>::iterator it = mymap.begin();
mymap.insert(it, std::pair<char, int>('b', )); //效率更高
mymap.insert(it, std::pair<char, int>('c', )); //效率非最高 //范围多值插入
std::map<char, int> anothermap;
anothermap.insert(mymap.begin(), mymap.find('c')); // 列表形式插入
anothermap.insert({ { 'd', }, {'e', } }); return ;
}

——————————————————————————————————————————————

三. 取值

 Map中元素取值主要有at和[ ]两种操作,at会作下标检查,而[]不会。

 map<int, string> ID_Name;

 //ID_Name中没有关键字2016,使用[]取值会导致插入
//因此,下面语句不会报错,但打印结果为空
cout<<ID_Name[].c_str()<<endl; //使用at会进行关键字检查,因此下面语句会报错
ID_Name.at() = "Bob";

——————————————————————————————————————————————

四. 容量查询

 // 查询map是否为空
bool empty(); // 查询map中键值对的数量
size_t size(); // 查询map所能包含的最大键值对数量,和系统和应用库有关。
// 此外,这并不意味着用户一定可以存这么多,很可能还没达到就已经开辟内存失败了
size_t max_size(); // 查询关键字为key的元素的个数,在map里结果非0即1
size_t count( const Key& key ) const; //

——————————————————————————————————————————————

五. 迭代器
共有八个获取迭代器的函数:* begin, end, rbegin,rend* 以及对应的 * cbegin, cend, crbegin,crend*。

二者的区别在于,后者一定返回 const_iterator,而前者则根据map的类型返回iterator 或者 const_iterator。const情况下,不允许对值进行修改。如下面代码所示:

 map<int,int>::iterator it;
map<int,int> mmap;
const map<int,int> const_mmap; it = mmap.begin(); //iterator
mmap.cbegin(); //const_iterator const_mmap.begin(); //const_iterator
const_mmap.cbegin(); //const_iterator

返回的迭代器可以进行加减操作,此外,如果map为空,则 begin = end。

——————————————————————————————————————————————

六. 删除交换
6.1 删除

 // 删除迭代器指向位置的键值对,并返回一个指向下一元素的迭代器
iterator erase( iterator pos ) // 删除一定范围内的元素,并返回一个指向下一元素的迭代器
iterator erase( const_iterator first, const_iterator last ); // 根据Key来进行删除, 返回删除的元素数量,在map里结果非0即1
size_t erase( const key_type& key ); // 清空map,清空后的size为0
void clear();

6.2 交换

 // 就是两个map的内容互换
void swap( map& other );

——————————————————————————————————————————————

七. 顺序比较

 // 比较两个关键字在map中位置的先后
key_compare key_comp() const;

示例:

 map<char,int> mymap;
map<char,int>::key_compare mycomp = mymap.key_comp(); mymap['a']=;
mymap['b']=;
mycomp('a', 'b'); // a排在b前面,因此返回结果为true

——————————————————————————————————————————————

八. 查找

 // 关键字查询,找到则返回指向该关键字的迭代器,否则返回指向end的迭代器
// 根据map的类型,返回的迭代器为 iterator 或者 const_iterator
iterator find (const key_type& k);
const_iterator find (const key_type& k) const;

举例:

std::map<char,int> mymap;
std::map<char,int>::iterator it; mymap['a']=;
mymap['b']=;
mymap['c']=;
mymap['d']=; it = mymap.find('b');
if (it != mymap.end())
mymap.erase (it); // b被成功删除

——————————————————————————————————————————————

九. 操作符
operator: == != < <= > >=
注意 对于==运算符, 只有键值对以及顺序完全相等才算成立。

c++库函数 Map的更多相关文章

  1. python库函数Map, Filter and Reduce的用法

    python中有三个函数式编程极大的简化了程序的复杂性,这里就做一下讨论和记录. 一 Map:应用在链表输入所有元素的函数,它的格式如下所示: map(function_to_apply, list_ ...

  2. reference to 'map' is ambiguous|

    reference to 'map' is ambiguous| c++编译出现此错误    表明定义的变量名字map和库函数map冲突而产生歧义

  3. 【Java心得总结七】Java容器下——Map

    我将容器类库自己平时编程及看书的感受总结成了三篇博文,前两篇分别是:[Java心得总结五]Java容器上——容器初探和[Java心得总结六]Java容器中——Collection,第一篇从宏观整体的角 ...

  4. underscore.js依赖库函数分析一(遍历)

    Underscore简介: underscore是一个非常简洁,实用的javascript库,和jQuery封装类型差不多,但underscore是backbone的依赖 库,想运行backbone就 ...

  5. C++常用库函数

    C++常用库函数  转自:http://blog.csdn.net/sai19841003/article/details/7957115 1.常用数学函数 头文件 #include <math ...

  6. 算法提高 9-3摩尔斯电码 map

    算法提高 9-3摩尔斯电码 时间限制:1.0s   内存限制:256.0MB     问题描述 摩尔斯电码破译.类似于乔林教材第213页的例6.5,要求输入摩尔斯码,返回英文.请不要使用"z ...

  7. 【iOS】swift 74个Swift标准库函数

    本文译自 Swift Standard Library: Documented and undocumented built-in functions in the Swift standard li ...

  8. c++11 标准库函数 std::move 和 完美转发 std::forward

    c++11 标准库函数 std::move 和 完美转发 std::forward #define _CRT_SECURE_NO_WARNINGS #include <iostream> ...

  9. STL容器——对map排序

    STL容器(三)——对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序 ,和输入 ...

随机推荐

  1. 解压unzip的用法

    1.把文件解压到当前目录下 [root@instance-q6z0ksfb xmerge_test]# unzip db1.zip 2.把文件解压到指定的目录下,需要用到-d参数. unzip -d ...

  2. What a Ridiculous Election UVALive - 7672 (BFS)

    题目链接: E - What a Ridiculous Election  UVALive - 7672 题目大意: 12345 可以经过若干次操作转换为其它五位数. 操作分三种,分别为: 操作1:交 ...

  3. bzoj2733 永无乡 splay树的启发式合并

    https://vjudge.net/problem/HYSBZ-2733 给一些带权点,有些点是互相连通的, 然后给出2种操作,在两点间加一条边,或者询问一个点所在的连通块内的第k小值的编号 并查集 ...

  4. MongoDB在CentOS上的安装和配置

    1. 创建mongodb-org-4.0.repo文件,并放入/etc/yum.repos.d目录下,repo文件内容如下 [mongodb-org-4.0] name=MongoDB Reposit ...

  5. LuoGu P1168 中位数

    题目描述 给出一个长度为 $ N $ 的非负整数序列 $ A_i $ ,对于所有 $ 1 ≤ k ≤ (N + 1) / 2 $ ,输出 $ A_1, A_3, -, A_{2k - 1} $ 的中位 ...

  6. 十二.HTTPS网站安全访问实践

    期中集群架构-第十二章-HTTPS安全证书访问连接实践配置========================================= 01:网络安全涉及的问题: ①. 网络安全问题-数据机密性 ...

  7. docker hub加速访问设置

    前言:docker是国外的,虽然有个版本开源免费,但是其docker  hub还是在国外,刚刚安装后,拉镜像就会发现,连接请求超时,中断服务,这是因为防火墙的问题,所以要将源指向国内的知名docker ...

  8. Java Spring Boot VS .NetCore (五)MyBatis vs EFCore

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  9. 使用AltSearch格式化Kindle读书笔记

    AltSearch是LibreOffice Writer的一个用于自动化执行复杂文本替换操作的扩展,能够在不需要复杂编程的条件下进行一些文档格式的手动与批量转换和调整.该扩展除了支持普通文本与正则表达 ...

  10. js分析 猫_眼_电_影 字体文件 @font-face

    0. 参考 https://developer.mozilla.org/zh-CN/docs/Web/CSS/@font-face 这是一个叫做@font-face 的CSS @规则 ,它允许网页开发 ...