对空向量进行排序
std::sort on empty vector
如果std::sort
得到一个空范围,它应该正确工作吗?
我得到一个分段错误(gcc 4.8.3):
std::vector<float> f;
std::sort( f.begin() + 1, f.end() );
标准说明对于空向量begin()
和end()
返回相同的值。所以我期望sort
在上面的情况下什么都不做,因为它应该得到一个空范围:begin()+1
应该大于end()
。
对于这个空范围sort:
没有问题std::sort( f.begin(), f.end() );
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
更可取。
对输入迭代器进行递增操作有一个先决条件,即迭代器必须是可解引用的。对于空向量,v.begin()
是不可解引用的,因此尝试执行v.begin() + 1
(它又以增量方式定义)是未定义的行为。
此外,std::sort(begin, end)
要求[begin, end)
是有效范围,并且标准规定(§24.2.1 [iterator.requirements.general]/p7)
Range
[i,j)
当且仅当j
与i
可达时有效。将标准库中的函数应用于无效范围的结果是未定义的。
对于大多数随机访问迭代器(唯一定义了<
和>
的迭代器类型),如果a > b
则a
不能从b
访问,因此[a, b)
不表示空范围——它根本不表示有效范围。
f.begin()+1
越界,这就是分割错误的原因。
使用f.begin()
作为数组的开头。这样使用起来就很安全了
- 计算排序向量的向量中唯一值的计数
- 查找两个排序向量中共有的元素
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 如何从C++的对的排序向量中获取有关给定值的相应对
- 对象接收堆栈溢出异常 c++ 的排序向量
- "x"的所有元素都存在于"y"(排序向量)中吗?
- 指向指针排序向量的指针向量的 C++ 向量
- 未排序向量上的lower_bound/upper_bound
- 智能指针的排序向量:神秘崩溃
- 按类型排序向量并按类型或派生类型搜索
- 如何在不使用标准算法的情况下在排序向量中添加 c 元素?
- C++排序向量<double>与在<Object>双成员变量上键控的向量
- 字符串指针的排序向量
- 具有前导数字的字符串的排序向量
- 保证重新排序向量
- 结构解释的C 排序向量
- 更新排序向量的一个条目
- 通过在排序向量上使用二叉搜索来定位未排序向量中的元素
- 排序向量上 std::find_if 和 std::bind2nd 的替代品
- 使用QuickSort算法以降序排序向量