首先了解下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