使用std::partition处理不可拷贝类元素触发拷贝构造删除错误如何解决
解决方案
你只需要将lambda谓词的传值参数改为const左值引用,即可解决编译报错,同时满足不拷贝元素、直接操作原序列的要求:
- 你当前的报错完全来自lambda参数的按值传递逻辑,和
std::partition算法本身无关。 - 可行性依据:MyType类已默认实现移动构造、移动赋值运算符,满足
std::partition对元素的可移动要求,算法内部重排元素时只会调用移动操作,无拷贝开销。 - 谓词参数修改逻辑:谓词仅需要读取元素的x成员做判断,不需要修改元素或转移所有权,用const左值引用传递参数不会触发任何拷贝构造逻辑。
修改后的代码如下:
typename std::vector<MyType>::iterator mid = std::partition(begin, end, [xval](const MyType& p){return p.x <= xval;});
执行后原vector会被直接重排,返回的mid迭代器为分区边界:迭代器之前的所有元素都满足p.x <= xval,之后的元素不满足条件,可直接用于后续逻辑处理,无需引入索引列表做间接分区。
内容的提问来源于stack exchange,提问作者Lavaman65
相关产品推荐
相关产品推荐

