向量迭代器 > vector.end() 即使向量不应该被重新分配

Vector iterator > vector.end() even though the vector should not have been reallocated

本文关键字:向量 不应该 新分配 分配 vector end 迭代器 gt      更新时间:2023-10-16

首先:如果有人能想出一个更简洁的表达方式,我很乐意更新标题中的问题。

情况如下:

我有一个向量作为类成员。从向量中提取元素后,使用以下内容:

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迭代器)还是>(容器的结束迭代器,没有任何意义。