random_shuffle修改混洗对象(c ++ 11)

时间:2015-06-05 10:34:56

标签: c++ algorithm c++11 shuffle

我有一个带有Tour对象的向量,想要将它们随机播放。幸运的是有一个函数random_shuffle()。我在洗牌之前和之后打印对象,但是,对象的一个​​字段根本没有洗牌。

首先想到的是复制或移动构造函数是不正确的。在两个构造函数中使用cout后,我发现使用了移动构造函数。奇怪的是,构造函数对我来说似乎是正确的。

下面给出了代码和移动构造函数。回想一下,在混洗后只有一个字段不正确,即d_penalty。任何人都可以帮我解决这个错误吗?

std::vector<Tour> tours;
// Fill vector with 4 tour objects

std::cout << "Print vector\n";
for (Tour const &tour: tours)
  std::cout << tour << std::endl;

std::cout << "Shuffle\n";
std::random_shuffle(tours.begin(), tours.end());

std::cout << "Print vector\n";
for (Tour const &tour: tours)
  std::cout << tour << std::endl;  

移动构造函数定义如下,

#include "tour.ih"

/**
 * Move constructor
 */

Tour::Tour(Tour &&other)
:
  d_capacity(other.d_capacity),
  d_demand(other.d_demand),
  d_feasible(other.d_feasible),
  d_length(other.d_length),
  d_time(other.d_time),
  d_penalty(other.d_penalty),
  d_tour(std::move(other.d_tour))
{ 
  cout << "Tour moved\n";
}

该课程定义如下,

class Tour
{
  // Current information about the tour
  int    d_capacity;    // Remaining capacity of the truck 
  int    d_demand;      // Total demand of all customers in the tour
  bool   d_feasible;    // Is the tour feasible in capacity
  double d_length;      // Length of the current tour
  double d_time;        // Driving time plus serving time
  double d_penalty;     // The penalty for infeasibility

  // The tour itself
  std::vector<City const *> d_tour;

  public:
    // Other functions

  private:
    // More functions
};

1 个答案:

答案 0 :(得分:3)

std::random_shuffle 交换元素。由std::swap实现的默认交换使用移动构造和移动分配。

如果您没有移动赋值运算符,则会使用复制赋值运算符。由于您的移动构造函数正确处理d_penalty,因此听起来您的副本赋值运算符未正确实现。

通常,可以从移动语义中受益的类应该同时具有移动构造函数和移动赋值运算符。在可能的情况下,特殊成员函数应定义为= default;

此外,std::random_shuffle在C ++ 14中已弃用,在C ++中已删除17;您应该在std::shuffle标题中使用<random>和URNG,例如std::mt19937