std::sort
不能保证稳定性。
但它是否可以保证确定性呢?
例如,这段代码是否总是会输出1
?
struct S
{
int a, b;
};
bool cmp(const S& lhs, const S& rhs)
{
return lhs.a < rhs.a;
}
int main()
{
std::vector<S> seq1 = {{1, 2}, {1, 3}};
std::vector<S> seq2 = seq1;
std::sort(seq1.begin(), seq1.end(), cmp);
std::sort(seq2.begin(), seq2.end(), cmp);
std::cout << (seq1.back().b == seq2.back().b) << '\n';
}
此外,除了显然的不确定元素(如随机数生成器和时钟)之外,C++标准库通常是确定性的吗?
f() + g()
这样的表达式中,两个函数调用的顺序是未指定的,并且在两次计算此表达式之间不必相同。 - Igor Tandetnikstable_sort
可以更安全。 - rustyx