map详解<一>
首先了解下pair工具类:
这个类在头文件<utility>,功能:将俩个类型可能不一样的值组合在一起。,通过first和second来访问这两个值。还定义了operator == 和operator <用来比较两个值;
看实例:
#include <iostream>
#include <map>
#include <utility>
int main()
{
std::pair<int ,std::string> myPair(,"hello");
std::pair<int ,std::string> myOtherPair; myOtherPair.first = ;
myOtherPair.second = "world"; std::pair<int,std::string> myThirdPair(myOtherPair); if(myPair < myOtherPair)
{
std::cout << "myPair < myOtherPair" << std::endl;
}else
{
std::cout << "myPair > myOtherPair" << std::endl;
} if(myOtherPair == myThirdPair)
{
std::cout << "myOtherPair == myThirdPair" << std::endl;
} else
{
std::cout << "myOtherPair != myThirdPair" << std::endl;
}
return ;
}
结果是:
myPair > myOtherPair
myOtherPair == myThirdPair
这个库也提供了make_pair<>的工具模板;通过make_pair()来构建一个pair;
std::pair<int,std::string> myPair = std::make_pair(,"hello");
std::cout << myPair.first << " " << myPair.second << std::endl;
结果是: 4 hello
map插入元素的两种方法
1.insert()函数
有两种方法:第一是直接使用map方法insert();insert函数初始化需要使用stdLLpair<>,或则是初始化列表。Insert返回的类型是std::pair<迭代器,bool>,可以用std::pair::first或则std::pair::second来访问。
map的模板接受四个参数,其中后两个参数可以省略,分别是:健,值,比较类型,分配器类型,是将健映射到值上。
#include <iostream>
#include <map>
#include <utility> class data
{
public:
data(std::string val)
:mVal(val)
{}
void setValue(std::string val){mVal = val;}
std::string getValue(){return mVal;} private:
std::string mVal;
};
int main()
{
std::map<int , data> myMap; myMap = {
{1,data("abc")},
{2,data("bcd")},
{3,data("cde")},
{4,data("efg")}
};
// auto ret = myMap.insert(std::make_pair(1,data("abcd")));
// if(ret.second)
// {
// std::cout << "insert success!" << std::endl;
// }else
// {
// std::cout << "insert fail!" << std::endl;
// }
std::map<int,data>::iterator it = myMap.begin();
for(;it != myMap.end();++it)
{
std::cout << "first : " << it->first << " ";
std::cout << "second :" << it->second.getValue() << std::endl;
}
}
结果是:
first : 1 second :abc
first : 2 second :bcd
first : 3 second :cde
first : 4 second :efg
operator[] 插入元素
#include <iostream>
#include <map>
#include <utility> class data
{
public:
data():mVal(""){}
data(std::string val)
:mVal(val)
{}
void setValue(std::string val){mVal = val;}
std::string getValue(){return mVal;} private:
std::string mVal;
};
int main()
{
std::map<int,data>myMap;
myMap[] = data("sdsfmd");
myMap[] = data("dslkmd");
myMap[] = data("qpamds");
myMap[] = data("lpsmzr"); std::map<int,data>::iterator it = myMap.begin();
for(;it != myMap.end();++it)
{
std::cout << "first->" << it->first << " ";
std::cout << "second->" << it->second.getValue()<< std::endl;
} return ;
}
这里需要注意,必须提供data类的默认构造函数;因为在operator[] 的时候,他总是会提供一个i新的值对象。不管用户需不需要,这就导致了operator[] 的效率会比insert()低下。
myMap[1] = data("sdsfmd");
myMap[1] = data("dslkmd");
那么myMap[1] 的值就会变成 dslkmd
map详解<一>的更多相关文章
- Sass map详解
作为一个CSS预处理器,Sass正受到越来越多的青睐,诸如Github.Codepen.CSS-Tricks.SitePoint.w3cplus等网站采用Sass组织.管理CSS文件,Sass正在逐渐 ...
- List、Set、Map详解及区别
一.List接口 List是一个继承于Collection的接口,即List是集合中的一种.List是有序的队列,List中的每一个元素都有一个索引:第一个元素的索引值是0,往后的元素的索引值依次+1 ...
- 源映射(Source Map)详解
一.什么是源映射 为了提高性能,很多站点都会先压缩 JavaScript 代码然后上线, 但如果代码运行时出现错误,浏览器只会显示在已压缩的代码中的位置,很难确定真正的源码错误位置. 这时源映射就登场 ...
- java中list和map详解
一.概叙 List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口, List下有ArrayList,Vector,LinkedList Set下有HashSet ...
- Array.prototype.map()详解
今天在地铁上看到这样一个小例子: ["1","2","3"].map(parseInt); 相信很多人和我一样,觉得输出的结果是[1,2,3 ...
- C++ map详解
1.什么是mapmap是一个键值对容器.在处理一对一数据是,很有用. 2.map数据结构的特点map内部自建一颗红黑树,这棵树具有对数据自动排序的功能,因此,map内的数据都是按key的值排好序的. ...
- python 中的map 详解
python中的map函数应用于每一个可迭代的项,返回的是一个结果list.如果有其他的可迭代参数传进来,map函数则会把每一个参数都以相应的处理函数进行迭代处理.map()函数接收两个参数,一个是函 ...
- 集合框架学习之Collection和Map详解
线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以 ...
- Javascript中Array.prototype.map()详解
map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数.callback 每次执行后的返回值组合起来形成一个新数组. callback 函数只会在有值的索引上被调用:那些从来没被赋 ...
- JavaScript Source Map 详解
源码地址: http://www.ruanyifeng.com/blog/2013/01/javascript_source_map.html 上周,jQuery 1.9发布. 这是2.0版之前的最后 ...
随机推荐
- [javaSE] 多线程(守护线程)
我们一般使用多线程,都是while的死循环,想要结束线程,只需退出死循环即可 当线程中调用了sleep()方法或者wait()方法,当前的线程就会进入冻结状态,这个线程就结束不了 调用Thread对象 ...
- ios开发 学习积累20161101
20161101 XML的声明 <?XML version="1.0" encoding="UTF-8" ?> XML文档必须有根元素 XML 对大 ...
- ChannelSftp.chmod方法赋权文件夹
最近对接分账工作需要上传分账文件到指定sftp服务器,在给sftp上文件夹赋权是遇到一个问题: 具体是ChannelSftp的chmod(int permissions, String path)方法 ...
- java的内存区域
java的内存区域分为程序计数器.java虚拟机栈.本地方法栈.java堆.方法区.运行时常量池. 1.程序计数器 2.java虚拟机栈 3.本地方法栈 4.java堆(新生代和老年代) 5.方法区( ...
- 【SSH网上商城项目实战12】添加和更新商品功能的实现
转自: https://blog.csdn.net/eson_15/article/details/51366370 添加商品部分原理和添加商品类别是一样的,不过要比商品类别复杂,因为商品的属性有很多 ...
- HTML绝对路径和相对路径
HTML路径: 绝对路径:从根目录开始 相对路径:../ 相对于html文件,上一级 ./ 相对于html文件,当前路径(可以省略) 文件夹名 相对于html文件,往文件里面走
- Vue2实践揭秘 - 书,读后作了一个简单摘要
jd上买了本实践相关的, 看过后,的确是实践项目后的一些分享,有些网上的一些vue2教程没怎么提及 ----------- 看完了,有些启发,作了个简单摘要作记录, 对vue2感兴趣的,可以自己网上搜 ...
- LaTeX 使用:itemize,enumerate,description 用法
itemize和enumerate还有description 是LaTeX里列举的三种样式,分别讲一些使用技巧.itemize(意为分条目): \begin{itemize} \item[*] a \ ...
- 你真的了解Fragment的生命周期吗?
Android Framwork开发人员中的传奇人物Dianne Hackborn在2010年将Fragment引入了Android,也就是在android3.0之后引入Fragment,他在提交信息 ...
- Mac系统查看端口占用和杀死进程
查看进程占用 lsof -i tcp:8080 该命令会显示占用8080端口的进程,有其 pid ,可以通过pid关掉该进程 杀死进程 kill pid 例如 kill 39394 转自:https: ...