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

Extending boost::hash for a custom data type

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 14. Boost.Functional/Hash

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::hash>выполняется путем вызова функции<hash_value>. Пространство имен не указано, чтобы оно могло обнаруживать перегрузки с помощью поиска, зависящего от аргумента. Таким образом, если есть бесплатная функция<hash_value>в том же пространстве имен, что и пользовательский тип, она будет называться.

Если у вас есть структура<library::book>, где каждый<book>однозначно определен его членом<id>:

namespace library
{
    struct book
    {
        int id;
        std::string author;
        std::string title;
        // ....
    };
    bool operator==(book const& a, book const& b)
    {
        return a.id == b.id;
    }
}

Тогда все, что вам нужно сделать, это написать функцию<library::hash_value>:

namespace library
{
    std::size_t hash_value(book const& b)
    {
        boost::hash<int> hasher;
        return hasher(b.id);
    }
}

Теперь вы можете использовать<boost::hash>с книгой:

library::book knife(3458, "Zane Grey", "The Hash Knife Outfit");
library::book dandelion(1354, "Paul J. Shanley",
    "Hash & Dandelion Greens");
boost::hash<library::book> book_hasher;
std::size_t knife_hash_value = book_hasher(knife);
// If std::unordered_set is available:
std::unordered_set<library::book, boost::hash<library::book> > books;
books.insert(knife);
books.insert(library::book(2443, "Lindgren, Torgny", "Hash"));
books.insert(library::book(1953, "Snyder, Bernadette M.",
    "Heavenly Hash: A Tasty Mix of a Mother's Meditations"));
assert(books.find(knife) != books.end());
assert(books.find(dandelion) == books.end());

Полный пример можно найти в:/libs/functional/hash/examples/books.hppи/libs/functional/hash/examples/books.cpp.

[Tip] Tip

При написании хеш-функции сначала посмотрите, как работает функция равенства. Равные объекты должны генерировать одно и то же хеш-значение. Когда объекты не равны, они должны генерировать различные значения хэша. В этом объекте равенство было основано только на id, поэтому хеш-функция только хеширует id. Если он был основан на названии объекта и авторе, то хеш-функция должна учитывать их (как это сделать обсуждается в следующем разделе).


PrevUpHomeNext

Статья Extending boost::hash for a custom data type раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 14. Boost.Functional/Hash может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 14. Boost.Functional/Hash ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:52:44/0.0064740180969238/0