[英]Vector::iterator crashes on compare with begin
我正在尝试通过向量反向迭代。 我已经使用typedef“制作”了一个迭代器:
typedef std::vector<Object*>::iterator Cursor;
我的问题是,此函数到达向量的开头时似乎崩溃。 我有以下代码:
void InsertFunc(Cursor& it, Object& o) {
vec_.insert(it, o);
--it;
for (; it >= vec_.begin(); --it) {
if ((*it)->type() == Object::SomeType) {
do_something
} else {
do_something_else
}
}
std::cout << "Insertion succes!" << std::endl;
}
我已经对其进行了测试,并且我确定该函数可以到达向量的开头,但是随后该程序将终止,并显示消息“插入成功!”。 永远不会打印。 知道为什么吗?
如果由于不断增加的重新分配而不得不将元素移动到内存中,则insert
器可能会使迭代器无效。
您可以从插入调用本身获取一个新的有效迭代器:
it = vec_.insert(it, o);
走了,你走了。
如果新元素已经在 begin()
处 ,则下一行--it
将导致失败。 您刚从头开始迭代。 老实说,我将重新审视此功能的逻辑。
- 迭代器失效规则
首先,对vec.insert( it, o )
的调用会使it
无效。 你要:
it = vec.insert( it, o );
(将迭代器返回到插入的元素)。
其次,如果it
等于vec.begin()
,则以下内容--it
非法。
第三,如果it >= vec.begin()
永远不会为假,除非代码包含未定义的行为:迭代器的有效范围是it >= vec.begin() && it < vec.end()
。 (但我们通常会尝试避免对迭代器的不平等进行比较,因为并非所有迭代器都支持它们。
您可能想要的是:
void InsertFunc( Cursor& it, Object const& o )
{
it = vec.insert( it, o );
while ( it != vec.begin() ) {
-- it;
// ...
}
}
当在一个范围内向后迭代时,通常的解决方案是使用while
,减量在顶部。
另外,您可以使用反向迭代器:
void InsertFunc( Cursor& it, Object const& o )
{
typedef std::vector<Object>::reverse_iterator RCursor;
it = vec.insert( it, o );
for (RCursor rit = RCursor(it); rit != vec.rend(); ++ rit ) {
// ...
}
}
(遗憾的是,似乎没有make_reverse
函数。但是,编写起来并不难。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.