擦除unordered_set中的列表元素

时间:2014-12-03 13:44:02

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

我有list<pair<int , double>> lSeedListunordered_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有效地并行化它(将每个线程中的列表分开,然后将它们与splice合并)?

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

1 个答案:

答案 0 :(得分:2)

最好使用标准算法std::remove_if

对于exameple

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 );
                     } );