循环中的矢量迭代器不可取消引用
Vector iterator not dereferencable in for loop
我使用一个循环来计算一个单词输入了多少次,然后打印这个单词以及输入了多少次数,这很有效,但它从不打印最后一个单词,我按字母顺序排序。在打印最后一个单词之前,它会出错,说迭代器不可取消引用。这是我的循环代码:
for (vector<string>::iterator it = v.begin() ; it != v.end(); ++it)
{
if (*it == *(it+1))
{
count++;
}
else if (*it != *(it+1))
{
count++;
cout << *it << " ---- " << count << endl;
count=0;
}
}
您的代码有未定义的行为-假设it
指向v
的最后一个元素,那么您正试图在*(it+1)
中取消引用v.end()
if (*it != *(it+1)
STL迭代器,end不指向最后一个元素;end()返回一个迭代器,该迭代器表示容器中元素的末尾。末端是最后一个元素后面的位置。这样的迭代器也被称为过端迭代器。
因此,begin()和end()定义了一个半开范围,该范围包括第一个元素,但排除最后一个
--------------------------------
| | | | | | | | |
--------------------------------
/ /
begin() end()
对于您想要实现的目标,请查看std::adjacent_file
auto it = std::adjacent_find(v.begin(), v.end());
if (it != v.end())
{
count ++;
}
else
{
cout << *it << " ---- " << count << endl;
}
当it == v.end() - 1
时,您将(it+1)
视为v.end()
,而尊重CCD_ 8是未定义的行为。
当您到达最后一个单词并尝试执行时:
if (*it == *(it+1))
it+1
指向v.end()
,它是一个有效的迭代器,但不可撤消。因此出现了错误。
当它在结束迭代器之前时,这里有一个问题:*(it+1)
,因为它试图取消引用结束迭代程序,这是无效的。
我不确定在这种情况下你希望你的逻辑做什么,但你可以在做你的事情之前用if (it+1 != v.end())
检查一下。
因为当it
接近末尾时,it+1
处于末尾,并且您试图在if
运算符中取消引用它。
相关文章:
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 在清除 istream 之前,我不应该需要取消获取它吗?
- 命名空间 std:: 不包含可选
- 为什么结构化绑定不支持可变数组?
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- RXCPP:创建一个不关心可观察量输入类型的扩展
- 对于实际指针类型,用于检测类似指针(可取消引用)类型的模板函数失败
- 在 Spirit X3 中使用布尔属性而不是可选属性
- 防御性地应用 std::move 到平凡可复制的类型是否不可取
- 使命令不产生可执行文件
- 我可以定义一个(键入的)常数,该常数确定不占据可执行文件中的空间
- GDB错误不以可执行格式:未识别的文件格式
- 为什么*_leastN_t和*_fastN_t类型是必需的,而不是可选的
- "make"的输出是一个共享对象,而不是可执行文件
- 运算符重载:简单添加...错误 C2677:二进制"+":未找到采用类型 ___ 的全局运算符(或者不存在可接受的转换)
- 在 Visual C++ 系统调用的路径中找不到可执行文件
- Eclipse Ubuntu 中的“程序不是可识别的可执行文件”错误
- 数组迭代器不是可取消引用的错误
- 迭代器不是可取消引用的堆栈(表达式树)和循环无法正常工作
- 列出迭代器而不是可取消引用的运行时