使用boost::bind Remove_if很慢

remove_if with boost::bind is slow

本文关键字:if 很慢 bind boost 使用 Remove      更新时间:2023-10-16

我有一个std::类列表,想要删除标记为删除的条目。我正在使用std::remove_if和erase.

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

我找不到关于创建和销毁什么的文档。所以我的问题很简单,如何让它更有效率?

尝试用std::list::remove_if替换对std::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 ) );
    }
};

您也许可以使用传递给std::remove_if的简单函子来解决问题。这样你就不需要在remove_if中向它传递任何参数,并为自己保存一个boost::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());
}

下面是一个编译的例子