STL map的用法介绍!
map对象的定义
使用前添加map头文件,必须分别指明键和值的类型:
map<string,int>word_count;
map的构造函数:
map<k,v>m; 创建一个名为m的空map对象,其键值类型分别为k和v
map<k,v>m(m2); 创建m2的副本m, m与m2必须有相同的键值类型
map<k,v>m(b,e); 创建map类型的对象,存储迭代器b和e标记的范围内所有元素的副本,元素的类型必须能转化为pair<const k,v>
map定义的类型
map对象的元素是键-值对,map的value_type反映了这样的事实,value_type是存储元素的键以及值的pair类型,而且键为const,比如word_count的类型为:
pair<const string, int>类型
map类定义的类型:
map<K,V>::key_type 在map容器中,用作索引的键的类型
map<K,V>::mapped_type 在map容器中,键所关联的值的类型
map<K,V>::value_type 一个pair类型,它的first元素具有const map<K,V>::key_type类型,而second元素则为map<K,V>::mapped_type类型
map迭代器进行解引用将产生pair类型的对象
map<string,int>::iterator map_it=word_count.begin();
cout<<map_it->first;
cout<<" "<<map_it->second;
map_it->first="new key" //error
++map_it->second
给map添加元素
使用insert成员实现或者先用下标操作符获取元素,然后给获取的元素赋值
使用下标访问map对象
map<string,int>woed_count; //空map
word_count["Anna"]=1; //插入默认的初始元素(键:Anna, 值:1)
map的下标也使用索引(就是键)来获取该键所关联的值,如果该键已在容器中,则map的下标运算行为相同,返回该键所关联的值。只有在所查找的键不存在的时候,map容器才为该键创建一个新的元素,并将它插入到此map对象中。
1、下标操作符返回值的使用
下标操作符返回的是左值,即使特定键所关联的值
cout<<word_count["Anna"];
++word_count["Anna"];
count<<word_count["Anna"];
2、下标行为的编程意义
如果下标所表示的键在容器中不在,则添加新元素,这一特性可使程序惊人的简练:
map<string, int>word_count;
string word;
while(cin>>word)
++word_count[word];
这段程序用来记录每个单词出现的次数
编程练习:编写程序统计并输出所读入的单词出现的次数
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<utility>
using namespace std;
int main()
{
map<string, int> word_count;
string word;
while(cin>>word)
++word_count[word];
map<string, int>::iterator it;
for(it=word_count.begin(); it!=word_count.end(); it++)
cout<<it->first<<":"<<it->second<<endl;
return 0;
}
map::insert的使用
插入单个元素的insert版本使用键-值pair类型的参数,对于参数为一对迭代器的版本,迭代器必须指向键-值pair类型的元素
map容器的接受单个值的insert版本的返回类型

使用下标给map添加新元素,元素的值部分将采用值初始化,而插入元素的另一个方法是:直接使用insert成员,语法更紧凑:
word_count.insert(map<string,int>::value_type("Anna",1));
传递给insert的实参相当的笨拙,可以用两种方法简化:
使用make_pair
word_count.insert(make_pair("Anna",1));
或使用typedef:
typedef map<string, int>::value_type valtype;
word_count.insert(valtype("Anna", 1))
检测insert的返回值
如果试图插入的元素所对应的键已经在容器中,则insert将不做任何操作,但是带有一个键-值pair形参的insert版本将返回一个值:包含一个迭代器和一个bool值的pair对象,其中迭代器指向map中具有相应键的元素,而bool值则表示是否插入了该元素
下面使用insert重写的单词统计程序:
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<utility>
using namespace std;
int main()
{
map<string, int> word_count;
string word;
while(cin>>word) {
pair<map<string, int>::iterator, bool> ret=word_count.insert(make_pair(word,1));
if(!ret.second)
++ret.first->second;
}
map<string, int>::iterator it;
for(it=word_count.begin(); it!=word_count.end(); it++)
cout<<it->first<<":"<<it->second<<endl;
return 0;
}
查找并读取map中的元素
下标操作符读取一个值会产生副作用,map容器提供了两个操作:count和find,用于检查某个键是否存在而不会插入该键
m.count(k) 返回m中k的出现次数
m.find(k) 如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器
1、使用count检查map对象中某键是否存在
对于map对象,count成员的返回值只能是0或1,map容器只允许一个键对应一个实例,所有count可有效地表明一个键是否存在
map<string, int> word_count;
int occurs=0;
if(word_count.count("foo"))
occurs=word_count["foo"];
2、读取元素而又不插入该元素
find操作返回指向元素的迭代器,如果元素不存在,则返回end迭代器
map<string, int> word_count;
int occurs=0;
map<string,int>::iterator it=word_count.find("foo");;
if(it!=word_count.end())
occurs=it->second;
从map对象中删除元素

STL map的用法介绍!的更多相关文章
- STL map 常见用法详解
<算法笔记>学习笔记 map 常见用法详解 map翻译为映射,也是常用的STL容器 map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器) 1. map 的定义 / ...
- STL map 详细用法
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个称为该关键字的值)的数据 处理能力. 需要的库 #include <map> ...
- Atcoder ABC155_C中有关c++ STL map的用法
题目:https://atcoder.jp/contests/abc155/tasks/abc155_c 这道题的题意是给我们n个string,让我们统计每个string出现的次数,并输出次数最多的一 ...
- C++标准模板库(STL)——map常见用法详解
map的定义 map<typename1, typename2> mp; map需要确定映射前类型和映射后类型,所以需要在<>内填写两个类型,第一个是键的类型,第二个是值的类型 ...
- C++ STL容器——stack用法介绍
stack是一种容器适配器,专门设计用于在LIFO上下文中操作(后进先出),其中元素仅从容器的一端插入和删除. 容器适配器,而不是一种容器. 它是容器适配器是指,只要支持一系列方法的容器(empty, ...
- C++ STL中哈希表Map 与 hash_map 介绍
0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能.例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华 ...
- STL vector用法介绍
STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...
- STL map 用法
首先make_pair Pairs C++标准程序库中凡是"必须返回两个值"的函数, 也都会利用pair对象 class pair可以将两个值视为一个单元.容器类别map和mul ...
- STL中map的用法
map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候 ...
随机推荐
- Toasts官方教程
Toasts IN THIS DOCUMENT The Basics Positioning your Toast Creating a Custom Toast View 在其它线程中启动Toast ...
- 一个简单的jsp+servlet登录界面的总结
这个登录界面我是用eclipse+tomcat7来实现的(网上比较多都是用myeclipse来做的) 1.首先是关于servlet部署的问题 首先你的servlet类要写在WEB-INF的Class文 ...
- Java socket2
通过socket对象可以获取通信对方的socket信息 客户端: import java.net.*; import java.io.*; public class TestServer { publ ...
- apache-storm-1.0.2.tar.gz的集群搭建(3节点)(图文详解)(非HA和HA)
不多说,直接上干货! Storm的版本选取 我这里,是选用apache-storm-1.0.2.tar.gz apache-storm-0.9.6.tar.gz的集群搭建(3节点)(图文详解) 为什么 ...
- form表单ajaxSubmit提交并验证
html: <form class="register-form" action="{:U('')}" method="post"&g ...
- JDBC基础学习
1.概念:java数据库连接技术 2.JDBC:是一个规范,提供接口(面向接口编程) 3.JDBC API:提供程序员调用的接口和类,集成在java.sql 和javax.sql包中.如:Driver ...
- "码代码"微信号今日上线,为互联网同仁提供最前沿咨询
"码代码"微信号今日上线 关注即有好礼相送 三月,春意浓浓的日子,三月,属于女人的日子,而今天...... “2014年天空成人放送大赏”于5日晚举办颁奖典礼,“年度最佳AV女优” ...
- VC++模拟一次鼠标点击返回原位置
HWND h; RECT r1; POINT p;//x,y void ONCE() { h=::FindWindow(NULL,"biaoti"); ::GetWindowRec ...
- System.Web.Optimization找不到引用怎么办
新建Bootstap for MVC5出现的问题, 通过打开VS 工具->NUGET程序包管理器->控制台 输入以下命令进行完成,一切完成 Install-Package Microsof ...
- jQuery 点击查看 收起
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...