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;
}
Другие вопросы по тегам