Невозможно создать unordered_set с лямбда-функцией - PullRequest
0 голосов
/ 29 октября 2018

я получаю ошибку

error: call to implicitly-deleted default constructor of '__compressed_pair_elem<(lambda at 
main.cpp:181:16), 1>': _Base1(std::forward<_Tp>(__t)), _Base2() {}

со следующим кодом. В чем ошибка, которую я совершаю, и я тоже не мог ее понять.

using namespace std;

auto my_hash = [](vector<int> const& vec){
    size_t seed = vec.size();
    for(auto& i : vec) {
        seed ^= i + 0x9e3779b9 + (seed << 6) + (seed >> 2);
    }
    return seed;
};

using MySet = unordered_set<vector<int>, decltype(my_hash)>;

int main() {
    vector<int> a{1,2,3};
    MySet s;
    return 0;
}

1 Ответ

0 голосов
/ 29 октября 2018

Типы замыканий не конструируются по умолчанию до C ++ 20 (см. P0624 ). Вам нужно передать экземпляр вашего хэша:

constexpr std::size_t bucket_count = 512;
MySet s{bucket_count, my_hash};

живой пример на wandbox.org


В качестве альтернативы вы можете использовать старый добрый struct:

struct Hasher {
auto operator()(vector<int> const& vec) const {
    size_t seed = vec.size();
    for(auto& i : vec) {
        seed ^= i + 0x9e3779b9 + (seed << 6) + (seed >> 2);
    }
    return seed;
}
};

using MySet = unordered_set<vector<int>, Hasher>;

int main() {
    MySet s;
}

живой пример на wandbox.org

...