我在按值访问地图时遇到问题。我不想使用find("string_value")
访问该值,而是find(s)
而string s="string_value"
。见下文:
map<string, string> my_map;
string s;
map<string, string>::iterator it_;
for(it_ = my_map.begin(); it_!= my_map.end(); it_++)
{
s = it_->second;
if (my_map.find(s) != my_map.end()) cout << my_map.find(s)->second << endl;
}
我最初的猜测是find()
接受const值而it_->second
不接受。因此,即使我的地图有值,if条件也会失败。但是没有编译时错误。有什么帮助吗?
答案 0 :(得分:3)
你应该研究Boost,特别是bimap
类。
http://www.boost.org/doc/libs/1_42_0/libs/bimap/doc/html/index.html
这将让您制作一个可以搜索双方的地图。
常规STL地图只能在密钥上搜索,而不能在值上搜索。
答案 1 :(得分:2)
当您说my_map.find(s)
地图并不知道您正在寻找某个值时,它可能无法知道,而是查找键 s
因此,如果您的地图也不包含该值作为键,那么查找将永远不会成功,即使它确实包含该键,它也可能不是您正在寻找的元素。
例如,如果您的地图包含{ {"one", "two"}, {"two", "three"} }
,则在第一次迭代时,您将搜索返回"two"
的{{1}},并在第二次迭代中搜索您的搜索{"two", "three"}
的失败。
没有编译时错误,因为您要求地图查找字符串,并且其键类型为字符串,因此它会搜索等于该字符串的键。
答案 2 :(得分:0)
几周前我也遇到过这个问题。我解决了以下问题:
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
map<string, string> m;
m.insert(pair<string,string>("black", "yellow"));
m.insert(pair<string,string>("green", "blue"));
auto found = m.end();
string search = "blue";
for(map<string, string>::iterator itr = m.begin(); itr != m.end(); itr++) {
if(itr->second.find(search) != string::npos) {
found = itr;
}
}
if(found != m.end()) {
cout << found->second;
}
}
但是这段代码是用C ++ 11标准编写的,所以如果你使用的是较旧的编译器,请小心。