C++ 标准库中的确定性

问题描述

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 和时钟)?

解决方法

一个范围一旦用 std::sort 排序,唯一的要求是元素根据提供的谓词进行排序。因此,如果存在多个可能的有效排序,那么只要生成其中任何一个,实现就是符合要求的。

每次在同一范围内调用 std::sort 时,允许实现生成不同的排序。它还可以在每次执行程序时生成不同的顺序。

这是 std::sort 上的 requirements。请注意,这里没有提到任何结果范围每次都相同的要求,因此不能保证结果是确定性的。