【发布时间】:2021-04-03 15:21:29
【问题描述】:
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++ 标准库通常是否具有确定性(除了明显不确定的元素,如 RNG 和时钟)?
【问题讨论】:
-
我不相信标准可以保证这种确定性。据我所知,它对这个问题保持沉默,因此实施不需要是确定性的。
-
事实上,对于核心语言,它明确说明了相反的情况(可能在非规范性注释中;我懒得查)——大意是,在一个表达式中与
f() + g()一样,两个函数调用的顺序是未指定的,而且在此表达式的两次求值之间不必相同。 -
没有这样的保证。使用
stable_sort是安全的。 -
不稳定的一个可能原因是如果在地下使用线程。
标签: c++ stl deterministic