gpt4 book ai didi

c++ - "vector iterator + offset out of range"断言有用吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:13 27 4
gpt4 key购买 nike

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

#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';
}

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';
}

关于c++ - "vector iterator + offset out of range"断言有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25130372/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com