2015-06-15 5 views
-2

Я решил проблему, чтобы найти дубликаты в спискестандартной библиотеки C++ хэш-код образца

Я использовал свойство набора, что он содержит только уникальные члены

set<int> s; 

// insert the new item into the set 
s.insert(nums[index]); 

// if size does not increase there is a duplicate 
if (s.size() == previousSize) 
{ 
    DuplicateFlag = true; 
    break; 
} 

Сейчас я пытаюсь решить та же проблема с хеш-функциями в стандартной библиотеке. У меня есть пример кода, как это

#include <functional> 

using namespace __gnu_cxx; 
using namespace std; 

hash<int> hash_fn2; 
int x = 34567672; 
size_t int_hash2 = hash_fn2(x); 

cout << x << " " << int_hash2 << '\n'; 

х и int_hash2 всегда одинаковы ли я что-то пропустил?

+1

Пожалуйста, отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve). Из кода, который вы опубликовали, неясно, почему вы ожидаете изменения 'x' и' int_hash2'. – juanchopanza

ответ

2

Для std::hash<int>, это нормально, чтобы вернуть оригинальное значение int. От specification необходимо только убедиться, что для двух разных параметрови k2, которые не равны, вероятность того, что std::hash<Key>()(k1) == std::hash<Key>()(k2) должна быть очень малой, приближается к 1.0/std::numeric_limits<size_t>::max(). Четкое возвращение исходного значения удовлетворяет требованию для std::hash<int>.

0

x и int_hash2 всегда одинаковы. Мне что-то не хватает?

Да. Вы говорите «Я пытаюсь решить ту же проблему с помощью хеш-функций», но функции хеша не являются функциональными альтернативами std::set<> и не могут сами по себе использовать для решения вашего пороблема. Вероятно, вы захотите использовать std::unordered_set<>, который будет использовать таблицу хеша , используя функцию std::hash<> (по умолчанию), чтобы помочь ей отобразить элементы из «ведра». Для целей хэш-таблицы хеш-функция для целых чисел, которая возвращает вход, обычно достаточно хороша, и если не предполагается, что программист предоставит свою предпочтительную альтернативу в качестве параметра шаблона.

В любом случае, все, что вам нужно сделать, чтобы попробовать хеш-таблицу, это изменить std:set<int> s; на std::unordered_set<int> s; в вашем исходном коде.

+0

Проблема заключается в обнаружении дубликатов в векторе или списке – NB2345

+0

@ NB2345: см. «Возможно, вы захотите использовать« std :: unordered_set <> '» выше: для каждого элемента в 'vector' или' list', call ' if (my_unordered_set.insert (value) .second) ... недавно вставленный ...; иначе ... был дубликат ...; '. См. [Здесь] (http://en.cppreference.com/w/cpp/container/unordered_set/insert). –

Смежные вопросы