Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Equality Predicates and Hash Functions

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 41. Boost.Unordered

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

В то время как ассоциативные контейнеры используют упорядоченное отношение, чтобы указать, как хранятся элементы, неупорядоченные ассоциативные контейнеры используют предикат равенства и хеш-функцию. Например,<boost::unordered_map>объявляется как:

template <
    class Key, class Mapped,
    class Hash = boost::hash<Key>,
    class Pred = std::equal_to<Key>,
    class Alloc = std::allocator<std::pair<Key const, Mapped> > >
class unordered_map;

Хэш-функция на первом месте, так как вы можете изменить хеш-функцию, но не предикат равенства. Например, если вы хотите использовать хешFNV-1, вы можете написать:

boost::unordered_map<std::string, int, hash::fnv_1>
    dictionary;

Существуетреализация FNV-1в каталоге примеров.

Если вы хотите использовать другую функцию равенства, вам также необходимо использовать соответствующую функцию хеширования. Например, для реализации словаря бесчувственного случая необходимо определить предикат и хеш-функцию бесчувственного равенства:

struct iequal_to
    : std::binary_function<std::string, std::string, bool>
{
    bool operator()(std::string const& x,
        std::string const& y) const
    {
        return boost::algorithm::iequals(x, y, std::locale());
    }
};
struct ihash
    : std::unary_function<std::string, std::size_t>
{
    std::size_t operator()(std::string const& x) const
    {
        std::size_t seed = 0;
        std::locale locale;
        for(std::string::const_iterator it = x.begin();
            it != x.end(); ++it)
        {
            boost::hash_combine(seed, std::toupper(*it, locale));
        }
        return seed;
    }
};

Который затем можно использовать в бесчувственном словаре:

boost::unordered_map<std::string, int, ihash, iequal_to>
    idictionary;

Это упрощенная версия примера на/libs/unordered/examples/case_insensitive.hpp, который поддерживает другие локализации и типы строк.

[Caution]Caution

Будьте осторожны при использовании оператора равенства<==>с пользовательскими предикатами равенства, особенно если вы используете указатель функции. Если сравнить два контейнера с различными предикатами равенства, то результат не определен. Для большинства объектов без состояния это невозможно — поскольку вы можете сравнивать объекты только с одним и тем же предикатом равенства, вы знаете, что предикаты равенства должны быть равными. Но если вы используете указатели функций или условный предикат равенства (например, boost::function), то вы можете попасть в беду.

Custom Types

Аналогично, пользовательская хеш-функция может использоваться для пользовательских типов:

struct point {
    int x;
    int y;
};
bool operator==(point const& p1, point const& p2)
{
    return p1.x == p2.x && p1.y == p2.y;
}
struct point_hash
    : std::unary_function<point, std::size_t>
{
    std::size_t operator()(point const& p) const
    {
        std::size_t seed = 0;
        boost::hash_combine(seed, p.x);
        boost::hash_combine(seed, p.y);
        return seed;
    }
};
boost::unordered_multiset<point, point_hash> points;

Поскольку хеш-функция по умолчаниюBoost.Hash, мы можемрасширить ее для поддержки типа, чтобы хеш-функция не нуждалась в явном задании:

struct point {
    int x;
    int y;
};
bool operator==(point const& p1, point const& p2)
{
    return p1.x == p2.x && p1.y == p2.y;
}
std::size_t hash_value(point const& p) {
    std::size_t seed = 0;
    boost::hash_combine(seed, p.x);
    boost::hash_combine(seed, p.y);
    return seed;
}
// Now the default function objects work.
boost::unordered_multiset<point> points;

Посмотреть. Хеш документациядля более подробной информации о том, как это сделать. Помните, что он опирается на расширения к проекту стандарта — поэтому он не будет работать для других реализаций неупорядоченных ассоциативных контейнеров, вам нужно будет явно использовать Boost. Хэш.

Table 41.3. Methods for accessing the hash and equality functions.

метод

Описание

<hasherhash_function()const>

Возвращает хеш-функцию контейнера.

<key_equalkey_eq()const>

Возвращает ключевую функцию равенства контейнера.



PrevUpHomeNext

Статья Equality Predicates and Hash Functions раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 41. Boost.Unordered может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 41. Boost.Unordered ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:23:22/0.029190063476562/1