[C ++] [std :: sort]它如何在2D容器上工作?

时间:2019-03-13 12:50:28

标签: c++ sorting stdvector

我有一个包含int s向量的向量对象

std::vector<std::vector<int>> vec;

我一直在尝试弄清std::sort(vec.begin(), vec.end())的工作原理。这是我的观察结果:

  1. 2D向量按大小排序。
  2. 如果某些内部向量的大小相同,则第一个元素的值较小的向量的索引值将较小。

我现在一直在生成一些2D向量,似乎这两个总是正确的。但是,我对第二个假设感到怀疑。 std::sort真的以这种方式工作,还是只是运气使我的假设正确?

2 个答案:

答案 0 :(得分:6)

对向量元素进行排序的方式与对任何其他类型进行排序的方式相同。 uuid使用给定的比较对象作为参数。如果未明确传递任何内容,则默认为std::sort

std::less使用std::less。根据矢量文档,它:

  

从字典上比较lhs和rhs的内容。比较由等效于operator<的函数执行。

     
     

词典比较是具有以下属性的操作:

     
      
  • 两个范围逐个元素进行比较。
  •   
  • 第一个不匹配元素定义了在字典上哪个范围小于另一个范围。
  •   
  • 如果一个范围是另一个范围的前缀,则较短的范围在字典上小于另一个范围。
  •   
  • 如果两个范围具有相等的元素并且长度相同,则范围在字典上是相等的。
  •   
  • 从字面上看,空范围小于任何非空范围。
  •   
  • 两个空范围在字典上相等。
  •   

简而言之,字典顺序排序与字典排序相同(忽略某些语言的奇数)。


  

2D向量按大小排序。

不完全是。 std::lexicographical_compare将被排序为{1}, {3, 4}, {1, 2, 5}

答案 1 :(得分:4)

select * from ( case when p_target then select * from table_a else select * from table_b end ); 默认使用std::sort进行排序。由于operator <具有重载的std::vector,因此将使用它。 std::vector::operator <进行词法比较,表示它返回具有第一个较小元素的向量。这意味着operator <小于{1, 1, 2},因为{1, 1, 3}小于2。如果向量的长度不同,但是较小的向量与较大的向量具有相同的元素,则返回较小的向量。这意味着

3

由于int main() { std::vector a{5, 1}, b{10}; std::cout << (a < b); } 小于1,因此打印5

10

打印int main() { std::vector a{5, 10}, b{5}; std::cout << (a < b); } ,因为0a大,但是它们具有相同的公共元素。