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

Sos*_*nos 9 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
}
Run Code Online (Sandbox Code Playgroud)

Cal*_*eth 11

std::sort需要ValueSwappable传递给它的迭代器,以及 MoveAssignable和MoveConstructible的中指向的类型。

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

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

即它将修改对象,使它们具有彼此开始的值。您的对象无法分配,因此实例化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() };

}
Run Code Online (Sandbox Code Playgroud)