remove_if with boost :: bind很慢

Ant*_*Ant 3 c++ boost boost-bind ref 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());
    }
};
Run Code Online (Sandbox Code Playgroud)

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

我以前在使用boost::ref非平凡变量作为绑定参数时使用过,但在这种情况下,我认为它可能是仿函数本身的创建和破坏,或者是造成问题的复制.

我想做点什么

boost::bind(&MyClass::isDone, boost::ref(this), boost::ref(_1));
Run Code Online (Sandbox Code Playgroud)

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

Pra*_*ian 8

尝试更换呼叫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 ) );
    }
};
Run Code Online (Sandbox Code Playgroud)

  • +1这是正确答案,`boost :: bind`完全不相关. (2认同)