map详解<一>

首先了解下pair工具类:

这个类在头文件<utility>,功能:将俩个类型可能不一样的值组合在一起。,通过first和second来访问这两个值。还定义了operator == 和operator <用来比较两个值;

看实例:

#include <iostream>
#include <map>
#include <utility>
int main()
{
    std::pair<int ,std::string> myPair(5,"hello");
    std::pair<int ,std::string> myOtherPair;

    myOtherPair.first = 4;
    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 0;
}

结果是:

myPair > myOtherPair
myOtherPair == myThirdPair

这个库也提供了make_pair<>的工具模板;通过make_pair()来构建一个pair;

std::pair<int,std::string> myPair = std::make_pair(4,"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[1] = data("sdsfmd");
    myMap[2] = data("dslkmd");
    myMap[3] = data("qpamds");
    myMap[4] = 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 0;
}

这里需要注意,必须提供data类的默认构造函数;因为在operator[] 的时候,他总是会提供一个i新的值对象。不管用户需不需要,这就导致了operator[] 的效率会比insert()低下。

myMap[1] = data("sdsfmd");
myMap[1] = data("dslkmd");
那么myMap[1] 的值就会变成
dslkmd
原文地址:https://www.cnblogs.com/boost/p/10400488.html