使用const成员对自定义对象的矢量进行排序

时间:2017-11-15 21:41:08

标签: c++ sorting stl

我想对一个带有const成员变量的类的对象进行排序 不幸的是,我收到一条错误消息,指出"没有匹配函数可以调用" swap""

当我删除 const id关键字时,std::sort()适用于重载的operator<()和自定义比较功能。

为什么会这样?我通常不能使用const成员变量对属于类的对象进行排序吗?

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct A
{
    const int id;
    A(int id) : id(id) {}
    bool operator<(const A &other) const
    {
        return id < other.id;
    }
};

bool cmp(const A &lhs, const A &rhs)
{
    return lhs.id < rhs.id;
}

int main()
{
    vector<A> vec;
    vec.emplace_back(3);
    vec.emplace_back(0);
    vec.emplace_back(2);
    vec.emplace_back(1);
    std::sort(vec.begin(), vec.end());
    std::sort(vec.begin(), vec.end(), cmp);
}

1 个答案:

答案 0 :(得分:4)

那么,实现排序的方式是它将根据需要交换对象。具有const成员且没有复制或移动赋值运算符的类不会是&#34;可交换&#34;。

我可能会将id成员设为private和non-const。然后我通过getter访问它(但不提供setter)。使其成为逻辑上的常量,但该类可以复制。

这样的事情:

class A {
public:
    A(int id) : id_(id) {}

    bool operator<(const A &other) const {
        return id_ < other.id_;
    }

    int id() const { return id_; }

private:
    int id_;
};