Как использовать stdext :: hash_set для пользовательского типа в VC ++ 2010? - PullRequest
2 голосов
/ 09 марта 2012

Я хочу использовать stdext::hash_set для пользовательского типа.

На самом деле я понял, как это сделать, но я не уверен, что это правильно (это компилируется, новыглядит несколько грязно).

Код выглядит следующим образом:

// This is my custom type
struct Point 
{
    Point(int _x, int _y, int _z) : x(_x), y(_y), z(_z) {}

    int x, y, z;

    bool operator< (const Point& other) const 
    {
        if (x != other.x) return x < other.x;
        if (y != other.y) return y < other.y;
        return z < other.z;
    }
};

// helper class
struct PointHashCompare {
    // value is copied from MS sources
    static const int bucket_size = 1;

    size_t operator() (const Point& p) const {
      return p.x * 31 * 31 + p.y * 31 + p.z;
    }

    bool operator() (const Point& a, const Point& b) const {
      return a < b;
    }
};

И объявление переменной следующее:

stdext::hash_set<Point, PointHashCompare> hSet;

Что означает bucket_size в PointHashCompare имеется в виду? Существует ли какая-либо документация Microsoft, которая объясняет bucket_size и предложения по ее значению и зачем она вообще нужна?

(могу предположить, что это связано с внутренней структурой хэшареализации, но могут использоваться разные подходы, которые также могут быть изменены в разных версиях VC ++)

Я также подумываю перейти на std::unordered_set, но теперь мне интересно, как управлять с stdext::hash_set

Спасибо!

1 Ответ

1 голос
/ 15 марта 2012

Целочисленная константа bucket_size указывает среднее число элементов за «корзину» (запись в хэш-таблице), которую контейнер должен стараться не превышать. Это должно быть больше нуля. Значение, предоставленное hash_compare равно 4.

Подробнее на странице hash_compare Class

...