首先了解下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详解<一>的更多相关文章

  1. Sass map详解

    作为一个CSS预处理器,Sass正受到越来越多的青睐,诸如Github.Codepen.CSS-Tricks.SitePoint.w3cplus等网站采用Sass组织.管理CSS文件,Sass正在逐渐 ...

  2. List、Set、Map详解及区别

    一.List接口 List是一个继承于Collection的接口,即List是集合中的一种.List是有序的队列,List中的每一个元素都有一个索引:第一个元素的索引值是0,往后的元素的索引值依次+1 ...

  3. 源映射(Source Map)详解

    一.什么是源映射 为了提高性能,很多站点都会先压缩 JavaScript 代码然后上线, 但如果代码运行时出现错误,浏览器只会显示在已压缩的代码中的位置,很难确定真正的源码错误位置. 这时源映射就登场 ...

  4. java中list和map详解

    一.概叙 List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口, List下有ArrayList,Vector,LinkedList Set下有HashSet ...

  5. Array.prototype.map()详解

    今天在地铁上看到这样一个小例子: ["1","2","3"].map(parseInt); 相信很多人和我一样,觉得输出的结果是[1,2,3 ...

  6. C++ map详解

    1.什么是mapmap是一个键值对容器.在处理一对一数据是,很有用. 2.map数据结构的特点map内部自建一颗红黑树,这棵树具有对数据自动排序的功能,因此,map内的数据都是按key的值排好序的. ...

  7. python 中的map 详解

    python中的map函数应用于每一个可迭代的项,返回的是一个结果list.如果有其他的可迭代参数传进来,map函数则会把每一个参数都以相应的处理函数进行迭代处理.map()函数接收两个参数,一个是函 ...

  8. 集合框架学习之Collection和Map详解

    线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以 ...

  9. Javascript中Array.prototype.map()详解

    map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数.callback 每次执行后的返回值组合起来形成一个新数组. callback 函数只会在有值的索引上被调用:那些从来没被赋 ...

  10. JavaScript Source Map 详解

    源码地址: http://www.ruanyifeng.com/blog/2013/01/javascript_source_map.html 上周,jQuery 1.9发布. 这是2.0版之前的最后 ...

随机推荐

  1. [javaSE] 多线程(守护线程)

    我们一般使用多线程,都是while的死循环,想要结束线程,只需退出死循环即可 当线程中调用了sleep()方法或者wait()方法,当前的线程就会进入冻结状态,这个线程就结束不了 调用Thread对象 ...

  2. ios开发 学习积累20161101

    20161101 XML的声明 <?XML version="1.0" encoding="UTF-8" ?> XML文档必须有根元素 XML 对大 ...

  3. ChannelSftp.chmod方法赋权文件夹

    最近对接分账工作需要上传分账文件到指定sftp服务器,在给sftp上文件夹赋权是遇到一个问题: 具体是ChannelSftp的chmod(int permissions, String path)方法 ...

  4. java的内存区域

    java的内存区域分为程序计数器.java虚拟机栈.本地方法栈.java堆.方法区.运行时常量池. 1.程序计数器 2.java虚拟机栈 3.本地方法栈 4.java堆(新生代和老年代) 5.方法区( ...

  5. 【SSH网上商城项目实战12】添加和更新商品功能的实现

    转自: https://blog.csdn.net/eson_15/article/details/51366370 添加商品部分原理和添加商品类别是一样的,不过要比商品类别复杂,因为商品的属性有很多 ...

  6. HTML绝对路径和相对路径

    HTML路径: 绝对路径:从根目录开始 相对路径:../ 相对于html文件,上一级 ./ 相对于html文件,当前路径(可以省略) 文件夹名 相对于html文件,往文件里面走

  7. Vue2实践揭秘 - 书,读后作了一个简单摘要

    jd上买了本实践相关的, 看过后,的确是实践项目后的一些分享,有些网上的一些vue2教程没怎么提及 ----------- 看完了,有些启发,作了个简单摘要作记录, 对vue2感兴趣的,可以自己网上搜 ...

  8. LaTeX 使用:itemize,enumerate,description 用法

    itemize和enumerate还有description 是LaTeX里列举的三种样式,分别讲一些使用技巧.itemize(意为分条目): \begin{itemize} \item[*] a \ ...

  9. 你真的了解Fragment的生命周期吗?

    Android Framwork开发人员中的传奇人物Dianne Hackborn在2010年将Fragment引入了Android,也就是在android3.0之后引入Fragment,他在提交信息 ...

  10. Mac系统查看端口占用和杀死进程

    查看进程占用 lsof -i tcp:8080 该命令会显示占用8080端口的进程,有其 pid ,可以通过pid关掉该进程 杀死进程 kill pid 例如 kill 39394 转自:https: ...