奇怪的std :: sort行为

时间:2017-10-27 17:19:07

标签: c++ sorting

我正在尝试使用std::string ID(结构的成员)对结构数组进行排序。这是代码:

struct Row {
   std::string ID;
   std::array<float, 5> scores;
   float avgScore;
};

std::array<Row, 50> records{};  

// ...
// Open a file, read some data and store them into records
// ...

// Sort the data
std::sort(records.begin(), records.end(), [](const Row& r1, const Row& r2) {
    return r1.ID > r2.ID;
});

到目前为止,一切都按预期进行。例如,以下数据:

  

liu 90 80 90 100 85
  ols 95 95 90 93 85
  kum 90 85 85 95 92

将排序为:

  

ols 95 95 90 93 85
  liu 90 80 90 100 85
  kum 90 85 85 95 92

但是,如果我只是改变:

return r1.ID > r2.ID;

为:

return r1.ID < r2.ID;

对于同一个例子,我会得到:

  

0 0 0 0 0 0
  0 0 0 0 0 0
  0 0 0 0 0 0

怎么可能呢?

1 个答案:

答案 0 :(得分:6)

std::array<Row, 50> records{};是一个包含50个Row实例的数组。如果您的数组包含50个元素,并且您只指定其中的3个元素,则数组中将保留47个默认构造元素。当您从文件中读取并且其余的默认构造元素在数组的前面进行排序时,您似乎没有为数组中的所有元素赋值。

如果在编译时您不确定需要多少元素,请考虑使用std::vector