본문 바로가기
C,C++/C++

[C++ STL] 특정 값 제외 컨테이너 복사 std::remove_copy() 함수

by woohyeon 2019. 11. 6.
반응형

안녕하세요.
오늘은 <algorithm> 헤더의 std::remove_copy() 함수에 대해 알아보겠습니다.
remove_copy 함수는 std::copy 함수와 유사한 동작을 하는 함수입니다.
4번째 인자를 추가로 받는 것을 제외하면 copy 함수와 동일한 동작을 합니다.


template <class InputIterator, class OutputIterator, class T>
OutputIterator remove_copy (InputIterator first, InputIterator last, OutputIterator result, const T& val);

remove_copy 함수는 [first, last) 범위의 요소들 중 val과 같은 요소를 제외하고 result 위치에 순차적으로 복사합니다.


first, last
[first, last) 범위의 컨테이너의 요소들을 복사합니다.

result
복사한 요소를 저장할 시작 위치를 지정합니다.
'=' 연산자를 이용하여 저장하기 때문에 저장 공간이 충분하지 않다면 런타임 에러가 발생합니다.

val
요소들을 val과 비교하여 '=='이 성립하지 않을 경우 복사를 수행합니다.
해당 인자만 제외하면 std::copy 함수와 동일합니다.

 

back_inserter()와 copy() 함수에 대한 포스팅은 아래 링크를 참고해주세요.

2019/10/26 - [C++/Function] - [C++ STL] 반복자 어댑터 std::back_inserter, 컨테이너 복사 std::copy 함수


remove_copy() 함수는 아래와 같이 동작합니다.
6라인을 보면 val와 같은 요소가 아닐 경우만 복사를 하고 있습니다.


예제)

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

using std::string;
using std::vector;
using std::cout;

int main(void)
{
	vector<int> vec_1;
	vector<int> vec_2;

	// 1 1 2 2 3 3 4 4 5 5
	for (int i = 1; i <= 5; ++i)
	{
		vec_1.push_back(i);
		vec_1.push_back(i);
	}

	// vec_1에서 3을 제외한 모든 요소를 vec_2로 순차적으로 복사합니다.
	std::remove_copy(vec_1.begin(), vec_1.end(), std::back_inserter(vec_2), 3);
	
	// 1 1 2 2 4 4 5 5
	for (int val : vec_2)
	{
		cout << val << " ";
	}

	cout << "\n";
	return 0;
}

 

결과)


설명)
vec_1의 모든 요소들 중 3을 제외한 요소를 순차적으로 vec_2의 끝에 복사합니다.


참고)
http://www.cplusplus.com/reference/algorithm/remove_copy/?kw=remove_copy




댓글