按值访问STL映射

时间:2013-05-13 22:27:22

标签: c++ map stl

我在按值访问地图时遇到问题。我不想使用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条件也会失败。但是没有编译时错误。有什么帮助吗?

3 个答案:

答案 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标准编写的,所以如果你使用的是较旧的编译器,请小心。