0

我在按值访问 Map 时遇到问题。我不想使用 访问该值find("string_value"),而是使用find(s)while访问该值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 条件也会失败。虽然没有编译时错误。有什么帮助吗?

4

3 回答 3

3

您应该查看 Boost,特别是bimap该类。

http://www.boost.org/doc/libs/1_42_0/libs/bimap/doc/html/index.html

这将让您制作一个双方都可搜索的地图。

常规 STL 映射只能在键上搜索,而不是在值上。

于 2013-05-13T22:30:41.383 回答
2

当您说my_map.find(s) 地图不知道您正在寻找一个值时,它不可能知道,而是寻找 s

因此,如果您的地图也不包含该值作为键,那么查找将永远不会成功,即使它确实包含该键,它也可能不是您要查找的元素。

例如,如果您的地图包含{ {"one", "two"}, {"two", "three"} }then 在第一次迭代中您将搜索"two"which returns {"two", "three"},而在第二次迭代中您将搜索"three"which 失败。

没有编译时错误,因为您要求映射查找字符串,并且它的键类型是字符串,因此它会搜索与该字符串相等的键。

于 2013-05-13T22:38:19.067 回答
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 标准编写的,所以如果你使用的是旧的编译器,请小心。

于 2013-05-13T22:54:30.677 回答