首先了解下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的模板接受四个参数,其中后两个参数可以省略,分别是:健,值,比较类型,分配器类型,是将健映射到值上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #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
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 继承的思维:从思维模式到架构设计的深度解析
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 当职场成战场:降职、阴谋与一场硬碰硬的抗争
· ShadowSql之.net sql拼写神器
· Excel百万数据如何快速导入?
· 无需WebView,Vue也能开发跨平台桌面应用