C++ C+中的决定论+;标准库
C++ C+中的决定论+;标准库,c++,stl,deterministic,C++,Stl,Deterministic,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
不保证稳定
但它保证是确定性的吗
例如,此代码是否总是打印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';
}
结构
{
INTA,b;
};
布尔凸轮轴位置(常数S&lhs、常数S&rhs)
{
返回左侧a<右侧a;
}
int main()
{
向量seq1={{1,2},{1,3};
标准::向量seq2=seq1;
std::sort(seq1.begin()、seq1.end()、cmp);
std::sort(seq2.begin()、seq2.end()、cmp);
std::cout一旦使用std::sort
对范围进行排序,对其唯一的要求是根据提供的谓词对元素进行排序。因此,如果可能存在多个有效排序,则只要实现生成其中任何一个,那么实现就是一致的
每次在同一范围内调用std::sort
时,允许实现生成不同的顺序。每次执行程序时,它也可以生成不同的顺序
这里是关于std::sort
。请注意,没有提到任何要求,即结果范围每次都相同,因此无法保证结果是确定性的。我不相信该标准能保证这种确定性。据我所知,该标准对这个问题没有任何规定,因此实现是确定的不要求是确定性的。事实上,对于核心语言,它明确地声明了相反的内容(可能是在非规范性注释中;我懒得查找它)-大意是,在类似f()+g()的表达式中
,两个函数调用的顺序未指定,而且在对该表达式的两次求值之间不必相同。没有这样的保证。使用是安全的。不稳定的一个可能原因是线程在地下使用。请链接源代码,我将接受此答案。@Phastasm我已链接到标准没有明确的措辞表明它是“非确定性的”,但我认为这可以从缺乏“确定性”保证的情况下推断出来.还有,如果需要更多,就有稳定的排序。@SoronelHaetir稳定性和决定论是不同的,人们可能只需要像问题代码中那样的决定论。@SoronelHaetir这并不能真正证明排序是不确定的。虽然保证没有稳定性的决定论是相当奇怪的,但是正如Phastasm指出的那样,至少是可能的。