2

我正在尝试编写一个在 C++ 中使用哈希表的程序。基本思想是我有很多数据点,我想使用一个哈希表,这样给定一个新点,我可以知道它是否已经存在。但是其中有一些错误,我真的不知道如何修复它。(错误消息:将 'const Point' 作为 'bool Point::operator==(const Point&)' 的 'this' 参数传递会丢弃限定符)提前致谢。

#include <iostream>
#include <unordered_map>
using namespace std;

class Point {
public:
    Point(int _x, int _y):x(_x), y(_y) {}
    bool operator==(const Point& lhs)
    { return this->x==lhs.x && this->y ==lhs.y; }
private:
    int x;
    int y;
};    
int main ()
{
    Point p1=Point(1,2);
    Point p2=Point(2,3);
    Point p3=Point(4,5);

    unordered_map<Point,bool> mymap = {{p1,true},{p2,true},{p3,true} };

    Point p4=Point(1,2);

    unordered_map<Point,bool>::const_iterator got = mymap.find(p4);

    if (got == mymap.end())
        cout << "not found";
    else
        cout << "already exists";

    cout<<endl;

    return 0;
}
4

1 回答 1

3

将自己声明operator==const

bool operator==(const Point& lhs) const   // add this 'const' at the end

运算符函数上的const限定符告诉编译器也this将被视为const.

完成后,您需要为class Point. 您可以通过以下两种方式之一来做到这一点。一个是做一个专门的散列类,另一个是专门化std::hash<>。这两种方法都在这里描述:http ://en.wikipedia.org/wiki/Unordered_associative_containers_%28C%2B%2B%29#Custom_hash_functions

编辑:这是一个提供模板特化的示例,用于hash<Point>调用Point. 请注意,我编写的散列函数是任意的——您应该试验并找出适合您目的的好的散列函数。

class Point {
public:
    Point(int _x, int _y):x(_x), y(_y) {}
    bool operator==(const Point& lhs) const
    { return this->x==lhs.x && this->y ==lhs.y; }

    size_t hash() const
    {
        return (x * 0xAAAA) ^ (y * 0x5555);
    }
private:
    int x;
    int y;
};    


namespace std
{
    template <> class hash<Point>
    {
      public:
        size_t operator()( const Point &p ) const
        {
            return p.hash();
        }
    };
}

std::hash<Point>::operator()回调该方法的原因Point::hash()是被散列的成员 (xy) 是privateto Point。还有其他方法可以处理访问控制策略,但这似乎相当干净。

这个特定的协议(类中的散列成员由 的专门化转发std::hash<>)似乎适合于适配器范式。不幸的是,我没有手边的 Josuttis 的 C++11 参考副本 ( http://www.cppstdlib.com/ ) 看看我是否在重新发明轮子……

于 2013-11-04T05:50:15.107 回答