tr1:: объединение unordered_set и пересечение

У меня было это в сценарии ниже и закрытие & amp; повторное открытие Visual Studio 2015 решило это для меня.

Несмотря на то, что OP уже упоминал, что он

, даже если я закрою все, начну новый проект ...

Я публикую это решение для тех, кто еще не пробовал.

Ссылка - Спасибо Джон Шнайдер

У нас есть библиотека, которую мы храним в частном репозитории Nuget. Вместо того, чтобы создавать бета-версии, иногда я просто компилирую библиотеку локально, удаляю ссылку на пакет nuget и добавляю ссылку в локальную корзину библиотеки. При перестройке проекта иногда я получаю эту ошибку. Закрытие и повторное открытие проекта разрешает его, и я могу построить.

21
задан 2 revs 22 May 2009 в 08:47
поделиться

2 ответа

Я вижу, что set_intersection () и др. из заголовка алгоритма не будут работать, поскольку они явно требуют сортировки входных данных - думаю, вы их уже исключили.

Мне пришло в голову, что «наивный» подход итерации по хешу A и поиск каждого элемента в хэше B должен фактически дать вам почти оптимальную производительность, поскольку последовательные поиски в хеш-коде B будут выполняться в одном и том же хеш-ведре (при условии, что оба хэша используют одну и ту же хеш-функцию). Это должно дать вам приличную локализацию памяти, даже если эти сегменты почти наверняка реализованы как связанные списки.

Вот код для unordered_set_difference () , вы можете настроить его, чтобы сделать версии для set union и set разница:

17
ответ дан 29 November 2019 в 21:12
поделиться

В этом нет ничего особенного - для пересечения просто пройдите через каждый элемент одного и убедитесь, что он находится в другом. Для объединения добавьте все элементы из обоих входных наборов.

Например:

void us_isect(std::tr1::unordered_set<int> &out,
        const std::tr1::unordered_set<int> &in1,
        const std::tr1::unordered_set<int> &in2)
{
    out.clear();
    if (in2.size() < in1.size()) {
        us_isect(out, in2, in1);
        return;
    }
    for (std::tr1::unordered_set<int>::const_iterator it = in1.begin(); it != in1.end(); it++)
    {
        if (in2.find(*it) != in2.end())
            out.insert(*it);
    }
}

void us_union(std::tr1::unordered_set<int> &out,
        const std::tr1::unordered_set<int> &in1,
        const std::tr1::unordered_set<int> &in2)
{
    out.clear();
    out.insert(in1.begin(), in1.end());
    out.insert(in2.begin(), in2.end());
}
14
ответ дан 29 November 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: