如何判断字符串是否存在于地图中?

时间:2014-04-20 21:36:56

标签: c++ c++11

考虑一个简单的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;
}

通常,我有两个字符串指针,我想比较字符串。我该怎么办?
提前谢谢。

3 个答案:

答案 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