Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的决定论+;标准库_C++_Stl_Deterministic - Fatal编程技术网

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指出的那样,至少是可能的。