向量迭代器 > vector.end() 即使向量不应该被重新分配
Vector iterator > vector.end() even though the vector should not have been reallocated
首先:如果有人能想出一个更简洁的表达方式,我很乐意更新标题中的问题。
情况如下:
我有一个向量作为类成员。从向量中提取元素后,使用以下内容:
inline int currentToken()
{
/* __it is of type std::vector <int>::iterator */
return (__it < __tokens.begin()) ? Syntax::OUT_OF_RANGE_BEGIN :
(__it > __tokens.end()) ? Syntax::OUT_OF_RANGE_END :
*__it;
}
返回的整数与预期的完全一样(在本例中为65,应该是65)。
然而,现在是事情变得棘手的地方。当遇到这个特定的令牌时,它会引发一个新的事件链,并且需要丢弃向量中以前的令牌。
首先,我调用类"saveLocation"成员函数,它是一个内联quickie:
__saved_it = __it;
然后,我调用'truncateHead'成员函数,这就是发生错误的地方。在编写代码之前,我想指出的是,上述内容都没有以任何方式更改向量,因此绝对没有理由重新分配向量的内存。
__it = __tokens.erase(__tokens.begin(), __saved_it+1); //segfault
一些调试表明,__it
在某种程度上大于__tokens.end()
,尽管它仍然大于__begin
,并且按预期被取消引用为数字'65'。
它怎么不在__tokens.begin()
和__tokens.end()
之间的范围内?
事实上,在上述saveLocation
方法中已经存在这种情况。
记住currentToken()
后面紧跟着saveLocation()
,如果迭代器已经超出范围,currentToken
会返回OUT_OF_RANGE_END
的积分表示,我很困惑。
完全彻底。
tokens.end()
返回一个结束迭代器。也就是说,它已经超出了范围。
比较迭代器是否大于(>
)超过结束迭代器是没有意义的,因为迭代器的范围仅从begin()
到end()
。由于同样的原因,检查迭代器是否小于begin()
返回的迭代器也是没有意义的。
这意味着无法检查迭代器是OUT_OF_RANGE_BEGIN
还是OUT_OF_RANGE_END
。您只能检查它是否在有效范围内。
可以检查迭代器是否大于或等于(>=
)begin()
返回的迭代器。
当您检查__it
是否超过最后一个元素时,您应该评估迭代器是否不等于tokens.end()
例如,你应该检查之类的东西
return (__it >= __tokens.begin()
&& __it != __tokens.end()) ? *__it : Syntax::OUT_OF_RANGE;
这还要求您不要将迭代器的增量超过容器的末尾迭代器。访问迭代器所指向的内存(该迭代器已递增超过end()
-迭代器)将导致未定义的行为。
迭代器比较仅对指向相同范围的迭代器有效。测试迭代器是<
(容器的begin
迭代器)还是>
(容器的结束迭代器,没有任何意义。
- 条件断点在不应该触发时触发
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 为什么我不应该把所有东西都放在标题中?
- 找不到 QRegularExpression 行为的任何解释。它有效,但不应该
- 在清除 istream 之前,我不应该需要取消获取它吗?
- 为什么向量不在代码块中运行?
- c++ 为什么我不应该从不同的线程解锁互斥锁
- "typename"不应该只在模板函数或模板类中使用吗?
- 为不应该获得未定义行为的内容获取未定义的行为
- 两种情况下的输出不应该相同吗?
- 默认情况下,"std::shared_ptr"不应该使用"std::d efault_delete"吗?
- 为什么向量不支持 size 作为成员变量,就像 Java 类中的长度变量一样,而是函数 size()?
- std::包含 std::函数回调的多个包装器的向量不起作用
- 错误代码 E0065 和 E0169 不应该有
- 矢量的值在不应该更改时更改
- 保证复制省略不应该适用吗?
- 不应该禁止访问私有类型吗?
- 使用匿名命名空间中的函数或另一个文件中的静态函数不应该出错吗?
- 堆栈在函数中弹出仍然显示在主函数中。调用不应该通过引用给定的向量吗
- 向量迭代器 > vector.end() 即使向量不应该被重新分配