• 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
  • 相关阅读:
    今日总结
    今日总结
    今日总结
    本周总结
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
    vue3函数setUp和reactive函数详细讲解
  • 原文地址:https://www.cnblogs.com/boost/p/10400488.html
Copyright © 2020-2023  润新知