迭代器有效性
Iterator validity
我在这里寻找更深入的解释,而不仅仅是如何获取工作代码。我知道如何编写较短的代码以删除元素。我在此处编写了此测试代码,以查明删除时的故障点。似乎不仅i迭代器变得无效,而且是.end()迭代器...这很有趣。
为什么这有效?
deque<shared_ptr<Vehicle>> data;
data.push_back( shared_ptr<Vehicle>(new Vehicle("porsche")) );
data.push_back( shared_ptr<Vehicle>(new Vehicle("fiat")) );
data.push_back( shared_ptr<Vehicle>(new Vehicle("fiat")) );
data.push_back( shared_ptr<Vehicle>(new Vehicle("bmw")) );
data.push_back( shared_ptr<Vehicle>(new Vehicle("fiat")) );
auto end = data.end();
for(auto i = data.begin(); i != end;)
{
if( (*i)->getName() == "fiat" )
{
auto ti = i;
++ti;
end = data.end(); //above erase, works but not logical
data.erase(i);
i=ti;
}
else
{
++i;
end = data.end();
}
}
但这不起作用?
deque<shared_ptr<Vehicle>> data;
data.push_back( shared_ptr<Vehicle>(new Vehicle("porsche")) );
data.push_back( shared_ptr<Vehicle>(new Vehicle("fiat")) );
data.push_back( shared_ptr<Vehicle>(new Vehicle("fiat")) );
data.push_back( shared_ptr<Vehicle>(new Vehicle("bmw")) );
data.push_back( shared_ptr<Vehicle>(new Vehicle("fiat")) );
auto end = data.end();
for(auto i = data.begin(); i != end;)
{
if( (*i)->getName() == "fiat" )
{
auto ti = i;
++ti;
data.erase(i);
end = data.end(); //Bellow erase...more logical but crashes
i=ti;
}
else
{
++i;
end = data.end();
}
}
我猜想这里存在一些实现级别问题。也许是编译器错误。使用GCC 4.8.2。
您正在调用未定义的行为。从语言规范中,关于deque::erase
:
擦除的操作擦除了Deque的最后一个元素,仅使过去的末端无效 迭代器和所有迭代器以及对擦除元素的引用。擦除的擦除操作 Deque的第一个元素,但并非最后一个元素仅使迭代剂无效,并引用了擦除的元素 元素。擦除操作既不擦除第一个元素也不是Deque的最后一个元素 使过去的迭代器和所有迭代器无效,并引用了Deque的所有元素。
在您的情况下,您的end
迭代器总是被凝结,这完全可以正常工作。第二种情况下的崩溃可能是由于i
上的操作而不是data.end
调用。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 列表的有效性在插入后开始迭代器
- 没有迭代器失效是否意味着推进迭代器的有效性?
- 螺纹安全与迭代器有效性
- 迭代器有效性
- 删除元素后 std::map::迭代器的有效性
- c++迭代器有效性问题
- std::vector<std::vector 的迭代器有效性<T>>
- STL列表:拼接迭代器有效性
- 通过插入保持std::list迭代器的有效性