Как использовать stdext:: hash_map, где ключ является пользовательским объектом?

Используйте это:

$('#pollSlider-button').animate({"margin-right": '+=200'});

Live demo

Улучшенная версия

Некоторый код был добавлен в демонстрация, чтобы предотвратить двойное поле при двойном щелчке: http://jsfiddle.net/XNnHC/942/

Используйте его с замедлением;)

http : //jsfiddle.net/XNnHC/1591/

  • Удалены лишние коды JavaScript.

  • Имена классов и amp; некоторые CSS-коды изменены

  • Добавлена ​​функция поиска, если развернуто или свернуто

  • Изменено, используется ли эффект замедления или нет

  • Изменена скорость анимации

http://jsfiddle.net/XNnHC/1808/

6
задан BradleyDotNET 16 September 2014 в 21:05
поделиться

2 ответа

Попробуйте следующее, сработало у меня в VS 2005. Это решение как для встроенного в VS2005 типа hash_map в пространстве имен stdext, так и для повышения unordered_map (предпочтительно). Удалите то, что вы не используете.

#include <boost/unordered_map.hpp>
#include <hash_map>

class HashKey
{
public:
    HashKey(const std::string& key)
    {
        _key=key;
    }
    HashKey(const char* key)
    {
        _key=key;
    }

    // for boost and stdext
    size_t hash() const
    {
        // your own hash function here
        size_t h = 0;
        std::string::const_iterator p, p_end;
        for(p = _key.begin(), p_end = _key.end(); p != p_end; ++p)
        {
            h = 31 * h + (*p);
        }
        return h;
    }
    // for boost
    bool operator==(const HashKey& other) const
    {
        return _key == other._key;
    }

    std::string _key;
};

// for boost
namespace boost
{
    template<>
    class hash<HashKey>
    {
    public :
        std::size_t operator()(const HashKey &mc) const
        {
            return mc.hash();
        }
    };
}

// for stdext
namespace stdext
{
    template<>
    class hash_compare<HashKey>
    {
    public :
        static const size_t bucket_size = 4;
        static const size_t min_buckets = 8;

        size_t operator()(const HashKey &mc) const
        {
            return mc.hash();
        }

        bool operator()(const HashKey &mc1, const HashKey &mc2) const
        {
            return (mc1._key < mc2._key);
        }
    };
}

int _tmain(int argc, _TCHAR* argv[])
{
    {
        stdext::hash_map<HashKey, int> test;
        test["one"] = 1;
        test["two"] = 2;
    }

    {
        boost::unordered_map<HashKey, int> test(8); // optional default initial bucket count 8
        test["one"] = 1;
        test["two"] = 2;
    }

    return 0;
}
2
ответ дан 17 December 2019 в 04:51
поделиться

Чтобы использовать хеш-таблицу, вам необходимо указать хеш-функцию. Вам необходимо создать функциональный объект, который представляет функцию, которая принимает объект MyKeyObject и возвращает size_t . Затем вы передаете функтор в качестве второго аргумента после начального размера:

hash_map <MyKeyObject, MyData> _myDataHashMap(initial_size, YourHashFunctor());

В качестве альтернативы вы можете написать свою хеш-функцию как специализацию шаблона для функтора hash для вашего типа; таким образом вам не нужно передавать специальную хеш-функцию.

Я не знаю, почему именно вы получаете эти ошибки. Возможно, он пытается использовать ваш объект как хэш-код или что-то в этом роде? В любом случае он не должен работать без хеш-функции. Хеш-функции заранее определены для целочисленных типов и строк.

3
ответ дан 17 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: