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)
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
。