2016-07-26 16 views
0

鉄道を想像してみてください。私たちはいくつかの駅といくつかのセクションを持っていますが、そこでは列車が減速して走行します(赤信号)。これらのセクションにはステーションを含めることができます。セクションをステーションを含まないパーツに分割する必要があります。リストがメモリを再割り当てすると、リスト::イテレータを更新する必要がありますか?

例:列車の1500mから3500mまで、列車はわずか40km/hで移動できます。 2000mと3000mに2つのステーションがあります。この場合、1500m〜2000m、2000m〜3000m、3000m〜3500mの3つのセクションが必要です。

私は元のreduspeedセクションをstd :: listに書き換えます。amd my while(for))doubleループは、内部ループがあるかどうかを調べます。 一つは持っている場合:

    関数は、2つの部分に分割し
  1. (temp_speed_section_1及び2)
  2. インサートが
  3. が元reduspeed_section
  4. を消去し、リスト内の実際のreduspeed_section前に、これらの部品はイテレータを移動する2位置back(temp_speed_section_1に格納されているオブジェクトである必要があります)
  5. は、新たに挿入されたreduspeed_sectionで検索を続行します(元のセクションにはさらに多くのステーションが存在する可能性があるため)

マイコード:

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

また '' while'と 'goto'を削除してif'を交換してください。 – LogicStuff

+0

これはリストの障害ではありません。メモリを再割り当てしていません(ベクトル_does_メモリの再割り当て)。_You_は要素を消去しており、その特定のイテレータを無効にします。 – MSalters

答えて

0

std::list::eraseが与えられたイテレータを無効に、あなたはiter_list_reduspeedsにその結果を格納必要があります。

iter_list_reduspeeds = split_reduspeeds.erase(iter_list_reduspeeds); 
std::advance(iter_list_reduspeeds, -2); 
関連する問題