首页 > 解决方案 > 对(我认为是)不可复制元素的列表进行分区

问题描述

这里是c ++的新手,我不确定要查找什么来解决这个问题,所以我在这里问。

我正在尝试使用该std::partition功能对列表进行分区。在这样做的过程中,我打了一个电话,有点像这样:

typename std::vector<MyType>::iterator mid = 
    std::partition(begin, end, [xval](MyType p){return p.x <= xval;});

我要重新排序的 's 列表的开始和结束迭代器在哪里begin和是。但是,当我这样做时,会出现以下编译错误:endMyType

'MyType' has been explicitly marked deleted here
 MyType(const MyType& src) = delete;

passing argument to parameter 'p' here
    std::partition(begin, end, [xval](MyType p){return p.x <= xval;});

我已经改变了类型名称,但这是它的长短。我环顾四周,发现因为我制作了MyType不可复制的代码,所以我的代码在抱怨,因为当我MyType p在括号中写“”时,我显然是在将它复制到用于分区的 lambda 函数中。

我的问题是:如何在不复制参数的情况下对这个列表进行分区?我真的更希望它是这个列表而不是任何其他列表(例如,如果可以避免的话,我不想对索引列表进行分区),因为我希望此列表中的连续组满足我的谓词,以便使其他我的部分代码更容易编写。

编辑:相关部分的定义MyType

class MyType {
public:
    ...

    MyType(const MyType& src) = delete;
    MyType& operator=(const MyType& src) = delete;
    MyType& operator=(MyType&& src) = default;
    MyType(MyType&& src) = default;

    ...
    
    float x;
}

标签: c++c++11

解决方案


推荐阅读