최근 책을 읽다가 우연히 벡터의 삭제 작업에 대한 세부 사항을 발견했습니다. 이 삭제 작업의 경우 이 삭제 작업에는 두 가지 형식이 있다는 것을 누구나 알고 있습니다. (1) 단일 요소 삭제, 매개변수는 반복자 변수입니다. (2) 간격 요소 삭제, 매개변수는 시작과 끝입니다. 세부정보는 단일 요소가 삭제될 때 발생하는 특정 사항입니다.
예: 다음과 같이 초기화된 벡터가 있습니다. vector
일반적으로 코드는 다음과 같이 작성됩니다.
#include <vector> #include <iostream> int main() { std::vector<int> va{ 1,2,3,4,4,5,6 }; std::vector<int> vb(va); for (auto i = va.begin();i != va.end(); i++) { if (*i == 4) { i = va.erase(i); } } for (auto i : va) { std::cout << i << " "; } return 0; }
얼핏 보면 잘못된 것은 없지만 결과는 예상치 못한 결과입니다
결과가 왜 이런가요? 곰곰이 생각해 보니 삭제에 오류가 있었던 것으로 나타났는데, if 조건이 성립되면 벡터에서 조건에 맞는 요소를 삭제하는 것이 핵심이다. 삭제 작업을 수행하면 반환된 값은 현재 삭제된 반복자의 다음 위치를 나타냅니다. 그런 다음 루프가 다시 반복되면 반복자가 한 위치만큼 뒤로 이동하여 동일한 요소가 삭제됩니다. 삭제되었습니다.
첨부된 철자가 정확합니다:
#include <vector> #include <iostream> int main() { std::vector<int> va{ 1,2,3,4,4,5,6 }; std::vector<int> vb(va); auto iter = vb.begin(); while(iter!=vb.end()) { if (iter != vb.end()) { if (*iter == 4) { iter = vb.erase(iter); } else { iter++; } } } for (auto j : vb) { std::cout << j << " "; } return 0; }
#include <vector> #include <iostream> int main() { std::vector<int> va{ 1,2,3,4,4,5,6 }; for (auto i = va.begin();i != va.end(); ) { if (*i == 4) { i = va.erase(i); } else { i++; } } for (auto i : va) { std::cout << i << " "; } return 0; }