2013-05-13 59 views
0

按值访问地图时遇到问题。我不想使用find("string_value")访问该值,但是如find(s)string s="string_value"。请看下图:按值访问STL地图

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()接受常量的值,而it_->second不是。所以即使我的地图有价值,如果条件失败。虽然没有编译时错误。任何帮助?

+0

我不明白你为什么遍历地图找到你已经指向的值... – 2013-05-13 22:32:40

+0

'std :: map'建模一个从键到值的映射 - 这是一种单向关系。您不能使用该值来获取相应的密钥。 – 2013-05-13 22:32:41

+2

你的初步猜测是错误的,因为比较并不关心常量。 – 2013-05-13 22:33:29

回答

2

当你说my_map.find(s)地图不知道你正在寻找一个价值,它不可能知道,而不是它看起来对关键s

所以,如果你没有按地图也不会将该值作为关键字,那么查找将永远不会成功,即使它包含该关键字,它也可能不是您要查找的元素。

例如,如果您的地图包含{ {"one", "two"}, {"two", "three"} }然后在第一次迭代,你会搜索"two"返回{"two", "three"},并在第二次迭代,你会搜索"three"其失败。

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

+0

我同意。谢谢! – akella 2013-05-14 01:28:26

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的标准被写入所以一定要小心,如果你是一个较旧的编译工作。

+0

当然,它可以做到。但是,有没有一点要搜索一个地图的价值?他们的目的是将特定的关键与特定的价值联系起来,这是你应该感兴趣的关联,而不是价值。 – 2013-05-14 00:16:38

+0

问题询问密钥是否可以是输入变量。上面的代码并不令人满意,因为'find(“blue”)'假定您已经知道名为“blue”的键存在。 – akella 2013-05-14 01:31:34

+0

为什么使用'm.insert()'而不是更高效的'm [“black”] =“yellow”'或m.emplace(“black”,“yellow”)'?为什么'm.end()'使用'auto'而不使用'm.begin()'?为什么不使用新的基于范围的'for'循环?为什么使用'find(“blue”)'not iter-> second ==“blue”'? – 2013-05-14 07:43:58