std::next 与 n > std::distance(it, c.end())

den*_*nys 4 c++ stl c++11

我不想使用,std::distance因为它会计算从迭代器到末尾的整个距离。但我需要确保从迭代器到末尾有 N 个或更多元素。所以我正在使用下一个代码:

if (std::next(it, n) != c.end()) // c is a std::multimap
{
    /// my logic
}
Run Code Online (Sandbox Code Playgroud)

一切都很好并且可以与我的编译器一起工作(g++ (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)),但我有疑问。在文档(cpprefenece.com && cplusplus.com)中,我找不到有关案例n > std::distance(it , c.end())或任何其他例外情况的任何信息。所以。我的代码安全吗?或者我应该自己写nextIfPossible

Jon*_*Mee 5

next(it, n)distance(it, c.end())如果小于则为未定义行为n

[C++14: 5.7/5] 如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则求值不会产生溢出;否则,行为是未定义的。

请参阅此处了解更多信息:非解引用迭代器是否超过了数组未定义行为的“最后一个”迭代器?

必须编写一个nextIfPossible,否则您的代码未定义。也就是说,因为我猜测这是一个随机访问迭代器,所以在必须执行边界检查的情况下,您会发现使用索引进行基准测试比使用迭代器更快:https ://stackoverflow.com/a/372​​99761 /2642059

因此,我建议甚至不要使用迭代器,或者nextIfPossible只是使用索引并根据大小检查它。

  • 请注意,您接受了该帖子的答案,它实际上谈论的是指针而不是迭代器。我仍然不确定我是否看到过证明 `end() + 1` 未定义的东西。 (3认同)