std::sort 空向量

use*_*436 -4 c++ sorting vector c++11

std::sort认为如果它得到一个空的范围内正常工作?

我收到此代码的分段错误(gcc 4.8.3):

std::vector<float> f;
std::sort( f.begin() + 1, f.end() );
Run Code Online (Sandbox Code Playgroud)

标准说对于空向量begin()end()返回相同的值。所以我希望sort在上面的情况下什么都不做,因为它应该得到一个空范围:begin()+1应该大于end().

这种空范围排序没有问题:

std::sort( f.begin(), f.end() );
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

std::sort期望[begin, end)是一个有效范围,这样如果您继续增加,begin您最终会达到end. 在您的情况下,begin()+1已超过end(),因此std::sort无法知道它正在查看范围的末尾。

std::sort需要迭代器,而不是指针。正因为如此,它无法运行begin < end检查:如果您通过rbegin()rend()两个迭代器,这将失败。

如果要对std::vector排除初始元素的部分进行排序,则需要确保容器不为空。否则,begin()+1会产生一个无效的迭代器。

注意:虽然从技术上讲,当您begin()+1在空容器上执行操作时会发生未定义的行为,但您的情况下的崩溃几乎肯定来自std::sort. 还要注意的是,如果你有一个C ++ 11兼容的编译器,使用std::next(v.begin(), 1)最好v.begin() + 1