https://cho001.tistory.com/164
C++ 벡터 특정 원소 지우는 방법 vector.erase(),remove() 등 Tips
1. Erase를 활용하는 방법 벡터 v에서 i번째 원소를 삭제하고 싶다면 erase 함수를 사용하면 된다. erase 함수의 인자는 iterator 즉, 지우고 싶은 원소의 주소이다. http://www.cplusplus.com/reference/vector/v..
cho001.tistory.com
C++ 레퍼런스 - string 의 erase 함수
modoocode.com
iterator erase(const_iterator position);
iterator erase(const_iterator first, const_iterator last); // itorator 범위 삭제
iterator = 삭제한 거 다음 원소의 iterator 를 가르킴
iterator 로 돌리는 와중에 iterator 을 삭제하면 오류가 발생한다.
for문의 it 은 ++ 통해서 다음 연산자를 가르키는데 erase 해버렸으니 오류가 발생할 수 있다
때문에 아래와 같이 it 을 erase 함수 의 return 값을 가져와야지 제대로 동작 할 수 있다.
int main()
{
// for 루푸중 erase 하면 고장남
vector<int> test;
for (int i = 0; i < 10; i++)
{
test.emplace_back(i);
}
int i = 0;
for (auto it = test.begin(); it != test.end(); it++)
{
if (i == 4 )
{
it = test.erase(it);
}
cout << *it << endl;
i++;
}
}
remove
ForwardIterator remove(ForwardIterator first, ForwardIterator last, const T& val);
ForwardIt remove_if( ForwardIt first, ForwardIt last, UnaryPredicate p );
remove iterator 번위내의 val 변수와 동일한 맴버를 컨테이너 맨뒤로 보낸다.
remove_if iterator 번위내의 함수 p 를 만족하는 멤버를 컨테이너 맨뒤로 보낸다.
맨뒤로 보낸다고 표현했지만 사실 데이터를 삭제하고 앞으로 땡긴다는 표현이 맞다
단 remove 는 컨테이너의 크기가 변하지 않기 때문에 erase로 지워죠야지 완전한 삭제가 완료 된다.
return 값 ForwardIt : 지울 맴버의 첫번째 iterator
사용 예시
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void _print(vector<int> test)
{
for (size_t i = 0; i < test.size(); i++)
{
cout << test[i] << ',';
}
cout << endl;
}
bool isodd(int temp)
{
if (temp % 2 == 1)
return true;
else
return false;
}
int main()
{
// for 루푸중 erase 하면 고장남
vector<int> test;
for (int i = 0; i < 10; i++)
{
test.emplace_back(i);
}
cout << "-----------1---------- " << endl;
_print(test);
cout << "-----------2---------- " << endl; // 3 없앰 뒤로 보냄
auto it = remove(test.begin(),test.end(), 3);
_print(test);
cout << "it : " << *it << endl;
cout << "-----------3---------- " << endl; // 홀 수 인 맴버 없앰
it = remove_if(test.begin(), test.end(), isodd);
_print(test);
cout << "it : " << *it << endl;
cout << "-----------4---------- " << endl; // 홀 수 인 맴버 없앰
test.erase(it, test.end());
_print(test);
cout << "it : " << *it << endl;
}
댓글