5月27日


ベクトルシーケンスブラウズで消去


std::erase関数は、インデックス内のデータを消去し、後のデータを残りの場所に移動します.

したがって,ベクトルを順次探索する場合,erase関数を用いるとベクトルのサイズとインデックスが減少し,初期i値の探索範囲とずれてしまうため,インデックスに基づいて消去すると問題が発生する.
vector<int> v = {1,2,3,4,5};

for(int i=0;i<v.size();i++){
	if(i==2) v.erase(v.begin()+i) // v의 i번째 요소를 지움 (v[2] == 3)
}                                     // 따라서 이 시점 이후로 v.size = 4, v ={1,2,4,5}
                                      // 즉, for루프문을 4번만 돈다.
したがって,この問題を解決するには,ループマンの増減式ではなく,反復文の内部で条件付きに増減する.

インデックスベースのナビゲーションで消去中


通常のインデックスベースの反復ループ文を使用してベクトルにアクセスすると、消去されていない場合にのみインデックスが増加します.
vector<int>v;
  for(int i=0; i<v.size(); ) {
   if(erase 할 조건) {
       v.erase(v.begin()+i);                    
   }
   else i++; // erase 안한경우에만 인덱스 증가
   }

反復ベースのナビゲーションで消去


削除に成功すると、eraseは削除要素の次の反復器を返します.そのため、すぐに値が代入されます.
vector<int>v;
vector<int>::iterator it;
  for(it v.begin(); i!=v.end(); ) {
   if(erase 할 조건) {
      it = v.erase(it);                    
   }
   else it++; // erase 안한경우에만 인덱스 증가
   }