본문 바로가기
공부,일/C++

erase

by fromnothing1 2021. 11. 6.

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

 

 

https://modoocode.com/240

 

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;

}

'공부,일 > C++' 카테고리의 다른 글

상속에 대해서 virtual, override , public , private, protected, friend  (0) 2021.11.21
DFS , BFS  (0) 2021.11.06
map  (0) 2021.10.24
연산자 오버 로딩  (0) 2021.10.18
복사 생성자  (0) 2021.10.18

댓글