繁体   English   中英

Vector :: iterator在与begin比较时崩溃

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM