在向量中对具有恒定引用属性的对象进行排序

时间:2019-05-22 08:43:42

标签: c++

我需要有关C ++向量的帮助。我有一个具有两个属性的对象,两个属性都是常量引用(这意味着我没有该类的空构造函数)。我需要使用其中一些对象创建向量,并需要根据其中一个属性的值对它们进行排序(特别是otherObj属性,该类具有所有运算符的重载)。

我遇到了麻烦,因为当我尝试对向量执行简单的std :: sort时,我认为它会尝试使用空构造函数创建该类的另一个对象来交换这些对象,所以我不这样做不知道该怎么办。

我粘贴了一个示例代码,说明我基本上如何拥有这些对象(我可能已经犯了一些错误)

class Object{
  const OtherObject& otherObj;
  const int& myInt;

  Object(const OtherObject& o, const int& i){
    this->otherObj = o;
    this->myInt = i;
  }

};

void myFunction(std::vector<OtherObject>& vec){
  int i1 = 1;
  int i2 = 2;
  int i3 = 3;

  Object obj1(vec.at(0), i1);
  Object obj2(vec.at(1), i2);
  Object obj3(vec.at(2), i3);

  std::vector<Object> myVec {obj1, obj2, obj3};

  //Sort the vector here
}

1 个答案:

答案 0 :(得分:10)

std::sort需要传递给它的ValueSwappable个迭代器,以及指向类型的MoveAssignableMoveConstructible

默认情况下,它将调用std::swap,大约为

template< class T >
void swap( T& a, T& b )
{
    T temp = std::move(a);
    a = std::move(b);
    b = std::move(temp);
}

即它将修改对象,以使它们彼此具有。您的对象无法分配,因此实例化swap失败。

可以 std::list::sort个不可分配的对象,所以

void myFunction(std::vector<OtherObject>& vec){
  int i1 = 1;
  int i2 = 2;
  int i3 = 3;

  Object obj1(vec.at(0), i1);
  Object obj2(vec.at(1), i2);
  Object obj3(vec.at(2), i3);

  std::list<Object> myList{obj1, obj2, obj3};
  myList.sort();
  std::vector<Object> myVec{ myList.begin(), myList.end() };

}