当列表重新分配内存时,我应该刷新list :: iterator吗?

时间:2016-07-26 09:37:26

标签: c++ list stl iterator

想象一条铁路线。我们有一些车站和一些火车以减速行驶的路段(reduspeeds)。这些部分可以包含电台。我需要将这些部分拆分为不包含工作站的部分。

例如:从该线的第1500米到第3500米,火车只能以40公里/小时的速度行驶。我有两个站在2000米和3000米。在这种情况下,我需要有3个部分:1500m - 2000m,2000m-3000m和3000m-3500m。

所以我把我原来的reduspeed部分变成了一个std :: list,amd my while(for())double循环遍历它并找出它是否有内部站点。 如果有:

  1. 该函数将其分为两部分(temp_speed_section_1和2)
  2. 在列表
  3. 中的实际reduspeed_section之前插入这些部分
  4. 删除原来的reduspeed_section
  5. 将迭代器2的位置向后移动(应该是存储在temp_speed_section_1中的对象)
  6. 使用新插入的reduspeed_section继续搜索(因为原始部分可以包含更多的工作站)
  7. 我的代码:

    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循环不会在下次尝试将新对象插入列表时崩溃。

    我试着找出问题所在。是否有可能当我将新值插入列表时,它会重新分配内存,但迭代器无法“刷新”自身,或类似的东西?

1 个答案:

答案 0 :(得分:0)

StderrPipe使给定的迭代器无效,您需要将其结果存储在std::list::erase中:

iter_list_reduspeeds