remove_if with boost :: bind很慢

时间:2013-03-07 17:45:04

标签: c++ boost ref boost-bind remove-if

我有一个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并删除了数千次。

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

我想做点什么

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

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

2 个答案:

答案 0 :(得分:8)

尝试使用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 ) );
    }
};

答案 1 :(得分:0)

您可以使用传递给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());
}

compiles here

的示例