这篇文章聊一下C++ STL库中的std::map通过key获取value的几种方法以及区别,然后提供一个最佳实践。
使用find()
函数可以获取到指定key对应的迭代器,从而获取value。
代码示例
//main.cpp
#include<map>
#include<string>
int main(int argc, char* argv[])
{
std::map<std::string, std::string> demoMap;
std::string sValue = "";
auto ite = demoMap.find("demo");
if (demoMap.end() != ite)
{
sValue = ite->second;
}
return 0;
}
在这段代码中,demoMap
是空的,不存在key为"demo"
的元素,所以find()
查不到合适的元素,就会返回demoMap.end()
对应的迭代器。
可以直接用key作为下标获取value。
代码示例
//main.cpp
#include<map>
#include<string>
int main(int argc, char* argv[])
{
std::map<std::string, std::string> demoMap;
std::string sValue = demoMap["demo"];
return 0;
}
这段代码实际上存在一些问题。在这段代码中,demoMap
是空的,不存在key为"demo"
的元素,这个时候使用下标[]的方法来获取value,就会在demoMap
中新建一个key为"demo"
的元素,导致demoMap被修改。
使用at()
函数也可以直接获取value。
示例代码
//main.cpp
#include<map>
#include<string>
int main(int argc, char* argv[])
{
std::map<std::string, std::string> demoMap;
std::string sValue = demoMap.at("demo");
return 0;
}
这段代码实际上也存在一些问题。同样的,在这段代码中,demoMap
是空的,不存在key为"demo"
的元素,这个时候使用at()
函数来获取value,会抛异常。
这篇文章所说的几种方法在介绍的时候也讲过区别了,如果不存在key所对应的元素时,find()
函数不会产生什么影响,使用下标[]会新建元素,at()
函数会抛出异常。
所以推荐做法也就是最佳实践,就是使用find()
函数,因为我们在查找的时候一般不希望数据被改变,另外我们在程序中应该尽量避免异常,异常处理是一件很麻烦的事。
如果这篇文章对你有帮助,别忘了关注我啊,可能我还会写出更多对你有帮助的文章
因篇幅问题不能全部显示,请点此查看更多更全内容