반응형

▶ vector에 중간 원소를 삭제하는 방법과  vector 중간에 데이터를 삽입하는 방법을 알아보겠습니다.

  제거 알고리즘(removing algorithm)은 '원소를 수정하는 알고리즘'의 특수한 형태입니다. 제거 알고리즘은 원소를 실제로 제거하지 않고 논리적으로 제거(다음 원소로 덮어쓰기)하기 때문에 순차열의 size를 실제로는 변경하지 않습니다. 실제 size를 변경하려면 컨테이너의 erase() 멤버 함수를 이용하면 됩니다.

[ 제거 알고리즘 정리 ]

알고리즘 설명
p = remove(b, e, x) 구간 [b, e)의 순차열을 x 원소가 남지 않도록 덮어쓰기로 이동한다. 알고리즘 수행 후 순차열은 [b, p)가 된다.
 remove() 알고리즘은 p = remove(b, e, x)는 구간 [b, e)의 순차열에서 x인 원소가 남지 않게 합니다. 이때 remove는 실제 원소를 제거하지 않습니다. 단지 다음 원소를 앞으로 이동합니다. size에는 변동이 없으며 remove() 알고리즘 후의 순차열은 [b, p)가 됩니다.

 

[ vector에서 중간 원소 삭제  remove() 알고리즘 + erase() 멤버함수 예제 ]

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	vector <int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	v.push_back(30);
	v.push_back(50);
	
	cout << "v = ";
	for(int i=0;i<v.size();i++)
	{
		cout << v[i] << ' ';
	}
	cout << '\n';
	
	vector<int>::iterator iter_end;
	iter_end = remove(v.begin(), v.end(), 30);
	
	cout << "remove 실행 후 = "; 
	for(int i=0;i<v.size();i++)
	{
		cout << v[i] << ' ';
	}
	cout << '\n';
	
	v.erase(iter_end, v.end());
		
	cout << "erase 실행 후 = "; 
	for(int i=0;i<v.size();i++)
	{
		cout << v[i] << ' ';
	}
	cout << '\n'; 
	
	return 0;
}

※ remove() 알고리즘은 순차열의 원소를 논리적으로 제거할 뿐 실제 제거하지는 않습니다. 만약 실제 컨테이너의 size까지 변경하려면 컨테이너의 erase() 멤버 함수를 사용합니다.

※ v.erase(iter_end, v.end())  명령어 실행 후 실제 size가 4가 됩니다.

 

반응형

'C++ STL' 카테고리의 다른 글

24. c++ stl map 컨테이너  (0) 2020.07.23
23. c++ stl vector 중복 원소 제거 - unique() erase()  (0) 2020.07.19
21. C++ STL deque이란  (0) 2020.06.25
20. c++ STL [vector 1일차 ] vector란?  (0) 2020.06.25
19. c++ stl 우선순위 큐  (0) 2020.06.11
Posted by 명문코딩컴퓨터
,