Вызов неявно удаленного конструктора по умолчанию unordered_set <vector <int>> - PullRequest
2 голосов
/ 13 июля 2020

Кажется, что когда я пытаюсь определить unordered_set вектора, я получаю сообщение об ошибке: «Вызов неявно удаленного конструктора по умолчанию для unordered_set< vector<int> >». Этого не происходит, когда я определяю обычный (упорядоченный) набор: set< vector<int> >. Похоже, мне нужно определить hash<vector<int>>, чтобы избавиться от ошибки.

Кто-нибудь знает, почему я получаю эту ошибку, только когда использую unordered_set? Разве обе структуры данных не должны использовать хеширование, тогда зачем unordered_set нуждаться в настраиваемой функции ha sh? На самом деле, не должен ли обычный (упорядоченный) set нуждаться в некотором настраиваемом компараторе, чтобы упорядочить структуры данных vector<int>?

Ответы [ 2 ]

0 голосов
/ 21 августа 2020

Вы знаете, что можете найти документацию для std::set и std::unordered_set, верно?

Разве обе структуры данных не должны использовать хеширование

Нет, из связанных документов:

std::set - это ассоциативный контейнер, содержащий отсортированный набор уникальных объектов типа Key. Сортировка осуществляется с помощью функции ключевого сравнения Compare. Операции поиска, удаления и вставки имеют логарифмическую c сложность. Наборы обычно реализуются как красно-черные деревья

Обратите внимание, что Compare по умолчанию std::less<Key>, а std::vector перегрузки operator<.

Однако

Неупорядоченный набор - это ассоциативный контейнер, который содержит набор уникальных объектов типа Key. Поиск, вставка и удаление имеют среднюю постоянную сложность.

Внутренне элементы не сортируются в каком-либо определенном порядке, а организованы в сегменты. В какую корзину помещается элемент, полностью зависит от ha sh его значения

, а для параметра типа Ha sh по умолчанию установлено значение std::hash<Key>. Это список специализаций для стандартных типов библиотек, и std::vector не включен в этот список.

0 голосов
/ 21 августа 2020

Это потому, что unordered_set использует шаблон std :: ha sh для вычисления ha sh для своих записей, а std :: ha sh для пар отсутствует. Вы должны определить пользовательский ha sh, чтобы использовать unordered_set.

    struct vector_hash
{
    template <class T1, class T2>
    std::size_t operator () (std::pair<T1, T2> const &v) const
    {
        return std::hash<T1>()(v.size());    
    }
};

, а затем объявить свой unordered_set как -

std::unordered_set< vector<int>, vector_hash> set;

Эта функция ha sh не подходит. Это просто пример.

...