考虑一个简单的std::map<std::string*,std::string*>
,我想检查地图中是否存在字符串指针的值。
我试过这个,但编译器在地图中查找指针本身,而我想检查指向的(实际)值。
int main() {
map<string*,string*> c;
std::string a("dude");
std::string* b=new string("dude");
std::string* ap;
c.insert(std::make_pair<string*,string*>(&a,&a));
for( map<string*, string*>::iterator ii=c.begin(); ii!=c.end(); ++ii){
ap=(*ii).first;
if(ap->compare(*b)){
cout<<"Yeah, dude has been found\n";
}
}
if(c.find(b)==c.end()){
cout<<"No dude!\n";//wrong!
}
if(c.count(b)==0){//how to find out if there is dude string?
cout<<"No dude dude!\n";//wrong!
}else{
cout<<"Yeah, dude has been found\n";
}
return 0;
}
通常,我有两个字符串指针,我想比较字符串。我该怎么办?
提前谢谢。
答案 0 :(得分:2)
你不能真正使用指针作为键,除非你真的希望指针成为键而不是它所指向的键。
指针&a
和指针b
不同,这就是您找不到密钥的原因。
使用普通(非指针)std::string
作为键,它应该可以更好地工作。
答案 1 :(得分:2)
如果经过仔细的测量和考虑后,您仍然确定无法接受重复那些std::string
并且可以保证string
只要在地图上保留,请考虑以下方法。不要仅仅因为使用它们。
最简单的方法就是使用std::reference_wrapper<T>
。它具有与原始指针相同的语义,除了对引用的对象执行比较/散列等
Chnossos刚刚提到了有用的标准库成员。
在此之后留下我的旧答案,因为它们允许更多自定义。
添加您自己的struct wrapped_pointer{std::string* x}
并专门设置比较器std::less
以考虑指向字符串。
为std::map
的第三个模板参数提供显式参数,可以实现几乎相同。
答案 2 :(得分:1)
如果您提供自定义函数/仿函数来比较两个string*
,则可以执行您想要的操作。
这是一个按照您的想法运作的版本:
#include <map>
#include <iostream>
#include <string>
using namespace std;
// Define a functor class to compare two string* objects.
struct string_less
{
bool operator()(string* lhs, string* rhs) const
{
return (lhs->compare(*rhs) < 0);
}
};
int main() {
// Use string_less while constructing the map.
map<string*,string*, string_less> c;
std::string a("dude");
std::string* b=new string("dude");
std::string* ap;
c.insert(std::make_pair<string*,string*>(&a,&a));
for( map<string*, string*, string_less>::iterator ii=c.begin(); ii!=c.end(); ++ii){
ap=(*ii).first;
// This was another line that needed to be fixed.
if(ap->compare(*b) == 0 ){
cout<<"Yeah, dude has been found\n";
}
}
if(c.find(b)==c.end()){
cout<<"No dude!\n";//wrong!
}
if(c.count(b)==0){//how to find out if there is dude string?
cout<<"No dude dude!\n";//wrong!
}else{
cout<<"Yeah, dude has been found\n";
}
return 0;
}
在我的机器上运行程序的输出:
Yeah, dude has been found Yeah, dude has been found