我有一个包含int
s向量的向量对象
std::vector<std::vector<int>> vec;
我一直在尝试弄清std::sort(vec.begin(), vec.end())
的工作原理。这是我的观察结果:
我现在一直在生成一些2D向量,似乎这两个总是正确的。但是,我对第二个假设感到怀疑。 std::sort
真的以这种方式工作,还是只是运气使我的假设正确?
答案 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);
}
,因为0
比a
大,但是它们具有相同的公共元素。