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容器映射是以二叉树的形式实现的,因此添加总是需要相同的时间