2016-11-20 2 views
2

У меня есть два элемента (6 и 747), которые разделяют их ключ («яйца»). Я хочу найти все элементы, которые разделяют ключ (скажем, «яйца», но я бы в реальной жизни сделал это для каждого ключа). Как это сделать?Как получить столкновение неупорядоченной карты?

Должен быть способ получить контейнер или что-то обратно из структуры данных. , ,

+0

На неупорядоченной карте вы не можете иметь один и тот же ключ с разными значениями, на самом деле я не задаю вопрос ... Вы спрашиваете, как проверить, является ли хэш нескольких разных ключей одинаковыми и выводится эти ведра? Тогда ответ krzaq правильный. – Banex

+0

Я не могу принять его еще @Banex, ограничение по времени! В самом деле, я был в замешательстве, но krzap помог! Благодаря! – gsamaras

ответ

2

Вы по-прежнему считаете ключ значение с ключом hash. Но ответить на вопрос, как спросил: вы можете использовать функцию bucket() член unordered_map «s с ковшом итераторов:

std::unordered_map<int,int,dumbest_hash> m; 
m[0] = 42; 
m[1] = 43; 

size_t bucket = m.bucket(1); 

for(auto it = m.begin(bucket), e = m.end(bucket); it != e; ++it) { 
    cout << "bucket " << bucket << ": " << it->first << " -> " << it->second << '\n'; 
} 

demo

В простых и в основном правильные точки, маркированные контейнеры подражают их упорядоченные аналоги с точки зрения интерфейса. Это означает, что если map не позволит вам иметь дубликаты ключей, то ни один из них не будет unordered_map.

unordered do использовать функцию хэширования, чтобы ускорить поиск, но если два ключа имеют одинаковый хеш, они не обязательно будут иметь одинаковое значение. Чтобы поведение было похоже на упорядоченные контейнеры, unordered_set и unordered_map будут рассматривать только элементы, равные, если они фактически равны (с использованием operator== или предоставленного компаратора), а не когда их хешированные значения сталкиваются.

Чтобы положить что-то в перспективе, предположим, что "eggs" и "chicken" имеют одинаковое значение хэша и что проверки равенства нет. Тогда следующий код будет «правильно»:

unordered_map<string, int> m; 
m["eggs"] = 42; 
m.insert(make_pair("chicken", 0)); // not inserted, key already exists 
assert(m["chicken"] == 42); 

Но если вы хотите разрешить ключи повторяющиеся в одной и той же карте, просто используйте unordered_multimap.

+0

Что это значит? Не имеют ли значения 6 и 747 и «яйца» их ключ? Ах, вы имеете в виду, что хеш-значение не является ценностью, ни ключом, верно? – gsamaras

+0

Хешированное значение является своеобразным внутренним по отношению к карте. «Яйца» - это ключ к вашим ценностям, конечно, но на самом деле карта использует числовой хэш, чтобы ускорить процесс. Вполне возможно, что другой ключ, например '' chicken '', также дает тот же хеш (он будет с' dumbest_hash' из примера), но поскольку они не являются равными ключами, они не будут считаться равными. Вы заметите только потерю производительности. – krzaq

+0

Да, спасибо, спасибо.Однако теперь вы отвечаете, чтобы дать мне элемент, который разделяет хеш-значение, а не ключ (который я действительно хочу, но не знаю), правильно? – gsamaras

2

Неупорядоченная карта не имеет элементов, разделяющих ключ.

Unordered мульти карта.

Используйте umm.equal_range(key), чтобы получить итераторы pair, описывающие элементы на карте, соответствующие данному ключу.

Однако обратите внимание, что «столкновение» при разговоре о хешированных контейнерах обычно относится к элементам с одним и тем же хэшированным ключом, а не к одному и тому же ключу.

Кроме того, рассмотрите возможность использования unordered_map<key, std::vector<value>> вместо мультимапа.

+1

Ваше последнее предложение дало мне искру. Почему я должен делать это? Быстрее, чем мультимап? Можете ли вы указать мне где-нибудь, чтобы прочитать об этом? Или, может быть, это другой вопрос, так что давайте не будем его покрывать здесь? – gsamaras

+0

Это хороший момент. Элементы Afaik с повторяющимся значением хэша хранятся в связанном списке, но я не уверен в том же ключевом значении в multimap. Тем не менее, вы можете использовать 'operator []', и вектор будет как минимум эффективен практически в любом случае. – krzaq

+0

@gsam правила недействительности инерции неупорядоченных контейнеров принудительно дублируют ключевые слова и хранят ключ и значение на основе узлов. Вектор не имеет одинаковых гарантий, поэтому он может пропускать дублирование ключей и сохранять значения смежно. Кроме того, мне нравится 'operator []' на картах, а отображение к векторам обрабатывает это. Это стоит рассмотреть. – Yakk