C++ 按值访问STL映射

C++ 按值访问STL映射,c++,map,stl,C++,Map,Stl,我按值访问地图时遇到问题。我不想使用find(“string\u value”)访问该值,而是使用find(s)而string s=“string\u 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;

我按值访问地图时遇到问题。我不想使用
find(“string\u value”)
访问该值,而是使用
find(s)
string s=“string\u 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;
} 
映射我的地图;
字符串s;
迭代器;
for(it=我的映射。begin();it!=我的映射。end();it++)
{
s=它->秒;

if(my_map.find(s)!=my_map.end())不能秒。因此,即使我的map有值,if条件也会失败。不过没有编译时错误。有什么帮助吗?

您应该查看Boost,特别是
bimap

这将让你制作一张两边都可以搜索的地图


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

您应该查看Boost,特别是
bimap

这将让你制作一张两边都可以搜索的地图


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

当你说
my\u map.find(s)
时,映射不知道你在寻找值,它也不可能知道,而是寻找键
s

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

例如,如果您的映射包含
{“一”、“二”}、{“二”、“三”}
,那么在第一次迭代中,您将搜索
“二”
,返回
{“二”、“三”}
,在第二次迭代中,您将搜索失败的
“三”


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

当您说
my\u map.find(s)
时,映射不知道您正在查找值,也不可能知道,而是查找键
s

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

例如,如果您的映射包含
{“一”、“二”}、{“二”、“三”}
,那么在第一次迭代中,您将搜索
“二”
,返回
{“二”、“三”}
,在第二次迭代中,您将搜索失败的
“三”


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

几周前我也遇到了此问题。我按以下方式解决了此问题:

#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;
    }
}
#包括
#包括
#包括
使用名称空间std;
int main(){
地图m;
m、 插入(成对(“黑色”、“黄色”);
m、 插入(成对(“绿色”、“蓝色”);
自动找到=m.end();
字符串搜索=“蓝色”;
for(map::iterator itr=m.begin();itr!=m.end();itr++){
if(itr->second.find(search)!=string::npos){
发现=itr;
}
}
如果(找到!=m.end()){
第二;
}
}

但是这段代码是用C++11标准编写的,因此如果使用的是较旧的编译器,请务必小心。

几周前我也遇到了这个问题。我通过以下方式解决了这个问题:

#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;
    }
}
#包括
#包括
#包括
使用名称空间std;
int main(){
地图m;
m、 插入(成对(“黑色”、“黄色”);
m、 插入(成对(“绿色”、“蓝色”);
自动找到=m.end();
字符串搜索=“蓝色”;
for(map::iterator itr=m.begin();itr!=m.end();itr++){
if(itr->second.find(search)!=string::npos){
发现=itr;
}
}
如果(找到!=m.end()){
第二;
}
}

但是这段代码是用C++11标准编写的,所以如果您使用的是较旧的编译器,请小心。

我不明白为什么您要通过映射迭代来查找您已经指向的值…
std::map
为从键到值的映射建模-这是一种单向关系。您不能使用该值来获取对应键。您最初的猜测是错误的,因为比较并不关心常量。您没有预料到会发生什么?据我所知。感谢您的建议/评论。我意识到
find(s)
使用map不存在类似的功能。最好的办法是使用boost bimap。但是,我不确定我们是否可以有一个自定义的find方法来完成我所需要的。我不明白为什么你也要通过map迭代来找到你已经指向的值…
std::map
为从键到值的映射建模-这是一种单向关系。您不能使用该值来获取相应的键。您最初的猜测是错误的,因为比较并不关心常量。您没有预料到会发生什么?据我所知,。感谢您的建议/评论。我意识到
find(s)
使用map不存在类似的功能。最好的选择是使用boost bimap。但是,我不确定我们是否可以有一个自定义的查找方法来完成我所需要的。当然,这是可以做到的。但是在地图上搜索值有意义吗?它们是为了将特定的键与特定的值相关联,这就是关联n您应该感兴趣的是键,而不是值。问题是键是否可以是输入变量。上面的代码不令人满意,因为
find(“blue”)
假设您已经知道名为“blue”的键存在。为什么要使用
m.insert()
而不是更有效的
m[“black”]=“yellow”
m.emplace(“黑色”、“黄色”)
?为什么对
m.end()
使用
auto
,而不是对
m.begin()
?为什么不对
循环使用新的基于范围的
?为什么不使用
find(“blue”)
而不是
iter->second==“blue”
?@JonathanWakely容器映射是以二叉树的形式实现的,因此添加总是需要相同的时间