std::unordered_multiset повторяющееся ведро исключений
Мой тестовый пример показан ниже:
std::size_t t(const int &i) { return i | 0b01010101010101010101010101010101; }
int main()
{
std::unordered_multiset<int, decltype(&t)> um(100, t);
um.insert(9872934);
um.insert(9024582);
um.insert(2589429);
um.insert(2254009);
um.insert(3254082);
um.insert(3945820);
um.insert(8347893);
auto intf = t(9872934);
for (auto cb = um.begin(intf), end = um.end(intf); cb != end; ++cb)
{
std::cout << *cb;
}
};
При отладке с помощью Microsoft Visual Studio Community 2022 v17.1.2 возникает исключение при построении итератора; сначала я подумал, что хэш-функция (
t
) может быть виноват, поэтому я пробовал это:
std::unordered_multiset<int> um; // no custom hash, just multiset of integers...
um.insert(9872934);
um.insert(9024582);
um.insert(2589429);
um.insert(2254009);
um.insert(3254082);
um.insert(3945820);
um.insert(8347893);
auto intf = t(9872934);
for (auto cb = um.begin(intf), end = um.end(intf); cb != end; ++cb)
{
std::cout << *cb;
}
Но он ведет себя точно так же даже в онлайн-компиляторах (проверьте ). Что мне не хватает? Как мне заставить это работать?
1 ответ
Аргумент к
begin(bucket)
функция - это номер ведра, а не ключ.
Вам нужно использовать
bucket
чтобы получить номер ведра, соответствующий ключу
auto intf = um.bucket(t(9872934)); <<<====
for (auto cb = um.begin(intf), end = um.end(intf); cb != end; ++cb)
{
std::cout << *cb;
}