我不想使用,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?
next(it, n)distance(it, c.end())如果小于则为未定义行为n。
[C++14: 5.7/5] 如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则求值不会产生溢出;否则,行为是未定义的。
请参阅此处了解更多信息:非解引用迭代器是否超过了数组未定义行为的“最后一个”迭代器?
您必须编写一个nextIfPossible,否则您的代码未定义。也就是说,因为我猜测这是一个随机访问迭代器,所以在必须执行边界检查的情况下,您会发现使用索引进行基准测试比使用迭代器更快:https ://stackoverflow.com/a/37299761 /2642059
因此,我建议甚至不要使用迭代器,或者nextIfPossible只是使用索引并根据大小检查它。
| 归档时间: |
|
| 查看次数: |
2370 次 |
| 最近记录: |