🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
##没有躲过的坑--map查找结果处理 通过键-值的方法进行搜索,可以使用map,极大的提高了速度。 下面代码就是使用map的find查找,通过键,找出对应的值。 ~~~ map<std::string, int> string_int_map; //对string_int_map进行初始化 map<std::string, int >::iterator iter_string_int; string substring_to_find = ":who call who:"; iter_string_int = string_int_map.find(all_emoji_string[i]); int result = iter_string_int ->second; ~~~ 还是,上面的程序大多数情况下没问题,但是我没有考虑万一map中不存在我们查找的键呢? 再看了一下find函数的返回值:  **引用具有指定键的元素的位置的迭代器,如果找不到具有键的匹配项,则引用映射中 (map::end()) 最后一个元素后面的位置。** 如果你没考虑这个,那么当返回map::end()后: ~~~ iter_string_int ->second; ~~~ 这个指向超尾的迭代器的second和first又是什么? 写个小程序测试一下: ~~~ #include<iostream> #include<map> int main() { std::map<std::string, int> test_map = { {"how", 3}, {"are", 4}, {"you", 5} }; std::map<std::string, int >::iterator iter_string_int; std::string key_string = "shit"; iter_string_int = test_map.find(key_string); std::cout << iter_string_int->second << std::endl; return 0; } ~~~ 运行:  崩溃。  ![这里写图片描述](http://img.blog.csdn.net/20151125224826360) 这是在控制台程序中,编译器会温柔的给你提示。  但是在一个大型的win32程序中,就不会这么轻易的给你提示了。 所以 我们要判断find函数的返回值: find的返回值不等于map::end(),才可以往下进行操作。 ~~~ #include<iostream> #include<map> int main() { std::map<std::string, int> test_map = { {"how", 3}, {"are", 4}, {"you", 5} }; std::map<std::string, int >::iterator iter_string_int; std::string key_string = "shit"; iter_string_int = test_map.find(key_string); if(iter_string_int == test_map::end()) { std::cout << "error" << endl; } else { std::cout << iter_string_int->second << std::endl; } return 0; } ~~~ [](http://blog.csdn.net/wangshubo1989/article/details/50043917#)[](http://blog.csdn.net/wangshubo1989/article/details/50043917# "分享到QQ空间")[](http://blog.csdn.net/wangshubo1989/article/details/50043917# "分享到新浪微博")[](http://blog.csdn.net/wangshubo1989/article/details/50043917# "分享到腾讯微博")[](http://blog.csdn.net/wangshubo1989/article/details/50043917# "分享到人人网")[](http://blog.csdn.net/wangshubo1989/article/details/50043917# "分享到微信")