【问题标题】:Erase list element from unordered_set从 unordered_set 中删除列表元素
【发布时间】:2014-12-03 13:44:02
【问题描述】:

我有一个list<pair<int , double>> lSeedList 和一个unordered_set<int> sToDelete。我想删除列表中第一个成员等于 sToDelete 中的 int 的对。目前我正在使用以下代码:

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 有效地并行化它(在每个线程中划分列表,然后将它们与拼接合并)?

我在 Windows 7 下使用 Visual Studio 2010。开始时 lSeedList 的大小约为 100 万,而 sToDelete 的大小约为 10000。对中的 int 就像一个唯一的 ID。

【问题讨论】:

  • 您应该查看erase-remove idiom,这基本上就是您的目标。
  • @Cyril 查看我更新的帖子。起初它在 lambda 表达式中有一个错字。:)

标签: c++ algorithm list linked-list openmp


【解决方案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() );

或类std::list的成员函数remove_if

例如

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

【讨论】:

  • 我用结构实现了第二个选项,信不信由你,我的代码显然稍微快了一点:) 我将尝试使用布尔向量的另一种方法。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 2014-12-19
  • 2013-11-25
相关资源
最近更新 更多