c++ - remove_if with boost::bind 很慢

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

我有一个 std::class 列表,想删除标记为删除的条目。我正在使用 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。

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

我想做类似的事情

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

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

最佳答案

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

关于c++ - remove_if with boost::bind 很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15278108/

相关文章:

c++ - STL vector 数据提取

c++ - Boost 和 std 的 result_of 问题,有些在 gcc 中编译,而在 msvc 中失败,反之亦然

node.js - 尝试使用 this.refs.value 时,使用 this.refs 已被弃用错误

c++ - 如何确保多线程 C++ 程序由多核服务器上的所有内核运行?

c++ - Win 事件替换为 boost 信号(线程安全)

material-ui - 如何在 TextField 中使用 ref

c# - 可以安全地假设由 new 初始化的所有 C# 变量都是引用吗?

c++ - "Drawing"在QT中使用完全透明的笔

c++ - 让 OpenCL 在 Qt5 中与 OpenGL 良好配合的正确方法是什么?

c++ - 修复了 C++ 中的时间步长循环