gpt4 book ai didi

c++ - vector 迭代器 > vector.end() 即使 vector 不应该被重新分配

转载 作者:行者123 更新时间:2023-11-30 01:21:43 29 4
gpt4 key购买 nike

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

情况是这样的:

我有一个 vector 作为类成员。使用以下命令从 vector 中提取元素后:

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,这是它应该的值)。

然而,现在事情变得棘手了。当遇到这个特定的标记时,它会引发新的事件链,并且 vector 中的先前标记需要被丢弃。

首先,我调用了类的“saveLocation”成员函数,这是一个内联的快速调用:

__saved_it = __it;

然后,我调用了“truncateHead”成员函数,这是错误发生的地方。在代码之前,我想指出以上都没有以任何方式改变 vector,所以绝对没有理由重新分配 vector 的内存。

__it = __tokens.erase(__tokens.begin(), __saved_it+1); //segfault

一些调试显示 __it 以某种方式大于 __tokens.end(),即使它仍然大于 __begin < em>and 如预期的那样解除了对数字“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;

这还要求您不要递增迭代器超过容器 past-the-end-iterator。访问已递增超过 end() 迭代器的迭代器指向的内存将导致未定义的行为。

关于c++ - vector 迭代器 > vector.end() 即使 vector 不应该被重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17712989/

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