0
我在这里寻找更深入的解释,而不仅仅是如何获得工作代码。我知道如何编写更短的代码来擦除元素。我在这里写了这个测试代码,以查明删除后的失败点。似乎不仅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。
您可能在代码中的其他地方存在导致未定义行为的错误。您需要编辑您的问题并提供[mcve]。 –
迭代器行为因容器类型而异。 “数据”究竟是什么? – 1201ProgramAlarm
已添加代码。保证没有错误别的地方。即。班车正常实施等等。我不会发布它以保持代码的专注和清洁。 – code