如何使算法或lambda不构造新对象



我有这个代码来在vector<Object*> list中查找对象的ID

int objID = ...

auto it = std::lower_bound(objectPtrList.begin(), objectPtrList.end(), objID,
[](const Object* obj, const Object& id)
{
return obj->worldMoveID < id.worldMoveID;
});

问题是,const Object* obj正在创建新对象。如何避免?

如果我将const Object* obj更改为const Object& obj,它将给我一个错误

错误(xutility(为:

Error   C2664   'bool battleCity::ObjectList::removeByMoveID::<lambda_e0fb723f01ea492d40d8d3f19c5f46e6>::operator ()(const battleCity::Object &,const battleCity::Object &) const': 
cannot convert argument 1 from 'battleCity::Object *' to 'const battleCity::Object &'   

您的对象创建不是来自const Object* obj,而是来自CCD_ 7(来自不是CCD_ 9的CCD_。

你可以改为:

auto it = std::lower_bound(objectPtrList.begin(), objectPtrList.end(),
objID,
[](const Object* obj, int id) { return obj->worldMoveID < id; });

我怀疑真正的问题不是const Object* obj,而是const Object& id,而发生复制是因为objID实际上不是Object。C++可以创建临时CCD_ 14以绑定到CCD_。

请注意,您也可以在此处使用std::find_if。您可以使用一个直接绑定id.worldMoveID的一元lambda,而不是反复传递它。

最新更新