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 안한경우에만 인덱스 증가
}
Reference
この問題について(5月27日), 我々は、より多くの情報をここで見つけました
https://velog.io/@zabaniya09/5월-27일
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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 안한경우에만 인덱스 증가
}
vector<int>v;
vector<int>::iterator it;
for(it v.begin(); i!=v.end(); ) {
if(erase 할 조건) {
it = v.erase(it);
}
else it++; // erase 안한경우에만 인덱스 증가
}
Reference
この問題について(5月27日), 我々は、より多くの情報をここで見つけました https://velog.io/@zabaniya09/5월-27일テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol