想象一条铁路线。我们有一些车站和一些火车以减速行驶的路段(reduspeeds)。这些部分可以包含电台。我需要将这些部分拆分为不包含工作站的部分。
例如:从该线的第1500米到第3500米,火车只能以40公里/小时的速度行驶。我有两个站在2000米和3000米。在这种情况下,我需要有3个部分:1500m - 2000m,2000m-3000m和3000m-3500m。
所以我把我原来的reduspeed部分变成了一个std :: list,amd my while(for())double循环遍历它并找出它是否有内部站点。 如果有:
我的代码:
namespace split
{
/** \brief Finds reduspeed sections (left) with inner station(s) and splits them into equivalent reduspeed sections without inner stations
*
* \param const &reduspeeds_left the origial vector of reduspeeds
* \param const &stations the stations of the line
* \return &split_reduspeeds the list to hold the new split and unchanged reduspeed sections
*
*/
bool FindOverhangingReduspeedSectionsLeft(std::vector <speed_section> const &reduspeeds_left, std::vector <station> const &stations,
std::list <speed_section> &split_reduspeeds)
{
std::copy(reduspeeds_left.begin(), reduspeeds_left.end(), std::back_inserter(split_reduspeeds));
std::list<speed_section>::iterator iter_list_reduspeeds = split_reduspeeds.begin();
int items_stations = stations.size();
speed_section temp_speed_section_1;
speed_section temp_speed_section_2;
while(iter_list_reduspeeds != split_reduspeeds.end())
{
label_1:
for (int j=0; j<items_stations; j++)
{
if (iter_list_reduspeeds->its_start < stations[j].its_left_station && stations[j].its_left_station < iter_list_reduspeeds->its_end)
{
temp_speed_section_1.its_start = iter_list_reduspeeds->its_start;
temp_speed_section_1.its_end = stations[j].its_left_station;
temp_speed_section_1.its_speed = iter_list_reduspeeds->its_speed;
temp_speed_section_2.its_start = stations[j].its_left_station;
temp_speed_section_2.its_end = iter_list_reduspeeds->its_end;
temp_speed_section_2.its_speed = iter_list_reduspeeds->its_speed;
split_reduspeeds.insert(iter_list_reduspeeds, temp_speed_section_1);
split_reduspeeds.insert(iter_list_reduspeeds, temp_speed_section_2);
split_reduspeeds.erase(iter_list_reduspeeds);
/// In order to avoid the need for sorted "stations" vector/list, iterator goes to the first part of the actual reduspeed
--iter_list_reduspeeds;
--iter_list_reduspeeds;
goto label_1;
}
}
++iter_list_reduspeeds;
}
return 0;
}
因此函数找到一个带有工作站的resduspeed部分,它将它分成两部分,将它们插入到列表中,擦除原始部分并重新定位迭代器。此时,迭代器指向speed_section对象(正确),但此对象的成员变量具有一些随机值。 while循环不会在下次尝试将新对象插入列表时崩溃。
我试着找出问题所在。是否有可能当我将新值插入列表时,它会重新分配内存,但迭代器无法“刷新”自身,或类似的东西?
答案 0 :(得分:0)
StderrPipe
使给定的迭代器无效,您需要将其结果存储在std::list::erase
中:
iter_list_reduspeeds