使用boost::bind Remove_if很慢
remove_if with boost::bind is slow
我有一个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());
}
下面是一个编译的例子
相关文章:
- 为什么一个向量上的多线程操作很慢
- VS 2017 和 2019 运行 c++ 真的很慢
- Visual Studio 2015 中的调试速度很慢 -- 无法关闭页面堆?
- 加快一个长python代码的速度,因为只有一个块,所以速度很慢
- 当给出预先排序的输入时,为什么我的快速排序实现很慢
- std ::距离很慢,如何改善它
- C++编译每次都很慢,即使我不更改源代码
- 通过Visual Studio将小型结构逐值传递到非内部函数的速度很慢
- QWebView 用于在桌面应用程序中运行 javascript (D3) - 当 HTML 更改时重新加载速度很慢
- 在向QtChart添加一些点后,它变得很慢
- 与Python相比,Tensorflow C++ API很慢
- QT 5.7 串口读取速度很慢
- 在 Windows 上从文件填充多维矩阵很慢
- 为什么 std::unordered_map 很慢,我可以更有效地使用它来缓解这种情况吗?
- C OpenMP在矩阵矢量产品上的工作很慢
- SFML屏幕运动很慢
- SDL TILEMAP渲染速度很慢
- GLFW窗口glfwSwapBuffers()真的很慢吗
- 如果在调试配置中编译,C++ hash_map.clear() 会很慢
- C 4D数组内存Deallocation速度很慢