Nano Hash - криптовалюты, майнинг, программирование

Удалить элемент списка из unordered_set

У меня есть list<pair<int , double>> lSeedList и unordered_set<int> sToDelete. Я хочу удалить из списка пары, первый член которых равен int в sToDelete. В настоящее время я использую следующий код:

void updateSL(list<pair<int, double> >& lSeedList, const unordered_set<int>& sAddedFacets)
{
    list<pair<int, double> >::iterator it = lSeedList.begin();
    while(it != lSeedList.end())
    {
        if(sAddedFacets.count(it->first) != 0)
            it = lSeedList.erase(it);
        else
            ++it;
    }
}

Есть ли способ ускорить этот код? Можно ли эффективно распараллелить его с помощью OpenMP (разделив список в каждом потоке, а затем объединив их с помощью соединения)?

Я использую Visual Studio 2010 под Windows 7. Размер lSeedList в начале составляет ~ 1 миллион, а размер sToDelete - ~ 10000. Int в паре действует как уникальный идентификатор.


  • Вы должны изучить erase-remove идиому, которая, по сути, является тем, что вы снимаете за. 03.12.2014
  • @Cyril Смотрите мой обновленный пост. Сначала у него опечатка в лямбда-выражении. :) 03.12.2014

Ответы:


1

Лучше использовать либо стандартный алгоритм std::remove_if

Например

lSeedList.erase( std::remove_if( lSeedList.begin(), lSeedList.end(),
                                 [&]( const std::pair<int, double> &p )
                                 {
                                     return sAddedFacets.count( p.first );
                                 } ),
                                 lSeedList.end() );

Или функция-член remove_if класса std::list

Например

lSeedList.remove_if( [&]( const std::pair<int, double> &p )
                     {
                         return sAddedFacets.count( p.first );
                     } );
03.12.2014
  • Я реализовал второй вариант со структурой, и, хотите верьте, хотите нет, мой кусок кода, по-видимому, немного быстрее :) Я собираюсь попробовать другие методы с использованием логического вектора. Спасибо за помощь ! 03.12.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..