“向量迭代器+偏移量超出范围”断言有用吗?

2024-04-28

这个完美的程序在 Visual Studio 2013 的调试模式下失败了:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void main()
{
  vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};

  for (auto iFrom = v.cbegin(), iTo = iFrom+5; iFrom != v.cend(); iFrom = iTo, iTo += 5)
    cout << *max_element(iFrom, iTo) << '\n';
}

with vector iterator + offset out of range断言失败。它失败了,因为iTo > v.cend(),这在这里是无害的。调试器测试未取消引用的迭代器的值有什么意义?

顺便说一句,我知道我可以将上面的循环重写为:

for (auto i = v.cbegin(); i != v.cend(); i += 5)
  cout << *max_element(i, i+5) << '\n';

但我试图用一段更复杂的现实代码制作一个简单的示例,其中计算新的迭代器值的计算成本很高。

我也意识到人是可以改变的_ITERATOR_DEBUG_LEVEL值来影响此行为,但它会导致某些库的二进制版本出现问题,这些库是使用默认调试设置构建的。


这不是无害的……而是未定义的行为尝试将迭代器移过去end(),您将在第三次也是最后一次迭代中执行此操作。事实上,这样做之后立即iTo += 5你终止你的循环iFrom != v.cend()不取消引用迭代器是不相关的。

如果确实需要效率,并且您准备好让银行押注元素数量为 5 的倍数:

for (auto iFrom = v.cbegin(), iTo = iFrom; iFrom != v.cend(); iFrom = iTo)
{
    iTo += 5;
    cout << *max_element(iFrom, iTo) << '\n';
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“向量迭代器+偏移量超出范围”断言有用吗? 的相关文章

随机推荐