4

我有一个 std::list 类,并且想要删除标记为删除的条目。我正在使用 std::remove_if 和擦除。

class MyClass
{
    bool isDone(MyData& myData)
    {
        return myData.isDone();
    }

    void removeIfDone(std::list<MyData>& myList)
    {
        std::list<MyData>::iterator it =
            remove_if(myList.begin(), myList.end(), 
                  boost::bind(&MyClass::isDone, this, _1));
        myList.erase(it, myList.end());
    }
};

我在一个小型处理器上运行,其内存分配和释放非常昂贵。此删除在我的应用程序中调用了数千次 new 和 delete。

我以前boost::ref在将非平凡变量作为绑定参数传递时使用过,但在这种情况下,我认为可能是仿函数本身的创建和销毁或它的复制导致了问题。

我想做类似的事情

boost::bind(&MyClass::isDone, boost::ref(this), boost::ref(_1));

我找不到关于正在创建和销毁什么的文档。所以我的简单问题是如何提高效率?

4

2 回答 2

9

尝试将调用替换std::remove_ifstd::list::remove_if。后者应该只从前面和后面的元素中复制一些指针,而不是尝试将元素移动到列表的末尾,这是您看到的多重分配的原因。另一个好处是,由于它是 的成员函数std::list,它实际上会删除(即擦除)与您的标准匹配的元素。

class MyClass
{
    bool isDone(MyData& myData)
    {
        return myData.isDone();
    }

    void removeIfDone(std::list<MyData>& myList)
    {
        myList.remove_if( boost::bind( &MyClass::isDone, this, _1 ) );
    }
};
于 2013-03-07T20:36:33.387 回答
0

您也许可以使用传递给您的std::remove_if. 这样你就不需要remove_ifboost::bind

struct functor
{
public:
    bool operator()(MyData& mydata)
    { 
       return mydata.IsDone();
    }   
};

void removeIfDone(std::list<MyData>& myList)
{
   std::list<MyData>::iterator it =
     remove_if(myList.begin(), myList.end(), 
         functor()); //call operator() on functor
     myList.erase(it, myList.end());
}

在此处编译的示例

于 2013-03-07T17:53:37.700 回答