c++ - Vector::iterator 在与 begin 比较时崩溃

标签 c++ vector insert iterator

我正在尝试反向迭代一个 vector 。我已经使用 typedef“制作”了一个迭代器:

typedef std::vector<Object*>::iterator Cursor;

我的问题是,这个函数在到达 vector 的开头时似乎崩溃了。我有以下代码:

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;
}

我已经对其进行了测试,并且我确信该函数到达了 vector 的开头,但随后程序终止并显示消息“插入成功!”永远不会打印。知道为什么吗?

最佳答案

如果由于不断增长的重新分配而必须在内存中移动元素,则 insert 可能会使您的迭代器失效。

您可以从插入调用本身获得一个新的、有效的迭代器:

it = vec_.insert(it, o);

你走了。

如果新元素已经在 begin() 中,您的下一行 --it 将导致失败;您刚刚迭代了开头。老实说,我会完全重新审视这个函数的逻辑。


- Iterator invalidation rules

关于c++ - Vector::iterator 在与 begin 比较时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20706399/

相关文章:

c++ - cudaGraphicsGLRegisterImage 给出 cudaErrorMemoryAllocation

c++ - boost.preprocessor 中定义常量的名称

c++ - 自己的自定义 vector 类。内存重新分配

mysql - 无法通过 mysql 中具有函数的 View 创建表

c++ - 如何使用c标准库获取目录大小

apache-spark - VectorUDT 用法

c++ - Eigen::RowVector 迭代器

mysql - 使用另一个表中的 'WHERE' 进行条件插入 - 不是插入的表

php - 使用一个 PHP 在 MySQL 中插入多条记录

c++ - 为什么在 C++ 中说 "can' t find constructor?