습관처럼

C++ - Algorithm 헤더 파일 replace(), replace_if(), remove(), remove_if() 본문

Language/C++

C++ - Algorithm 헤더 파일 replace(), replace_if(), remove(), remove_if()

dev.wookii 2020. 4. 13. 16:54

[replace(arr_begin ,arr_end ,replace_before_value ,replace_after_value) : 특정한 값을 다른 값으로 대체.]

 

arr_begin ,arr_end - 구간의 시작점과 끝점

replace_before_value - 대체할 값

replace_after_value - 결과값 

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

int main(){

	int a[10] = {1, 3, 2, 4, 5, 2, 4, 2, 8, 6};
	int b[10];
	copy(a, a+10, b);
	replace(a, a+10, 2, 7);
	replace(b+3, b+8, 2, 7);

	cout << "배열 a:";
	for(int i=0; i<10; i++)
		cout << ' ' << a[i];
	cout << endl << "배열 b:";
	for(int i=0; i<10; i++)
		cout << ' ' << b[i];
	cout << endl;

	return 0;
}
배열 a: 1 3 7 4 5 7 4 7 8 6
배열 b: 1 3 2 4 5 7 4 7 8 6

 

[replace_if(arr_begin ,arr_end ,condition_functions ,replace_after_value) : 조건에 맞는 모든 값을 특정한 값으로 바꿉니다.]

 

arr_begin ,arr_end - 시작 끝 지점 

condition_functions - 조건(Bool) function

replace_after_value -  바뀌게 될 Value

세 번째 매개변수는 그냥 값이 아닌, bool 타입을 리턴하는 함수의 포인터가 됩니다.

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

bool isOdd(int n){
	return (n%2 == 1);
}

bool lessThan5(int n){
	return (n < 5);
}

int main(){

	int a[10] = {1, 3, 2, 4, 5, 2, 4, 2, 8, 6};
	int b[10];
	copy(a, a+10, b);
	replace_if(a, a+10, isOdd, 7);
	replace_if(b, b+10, lessThan5, 7);

	cout << "배열 a:";
	for(int i=0; i<10; i++)
		cout << ' ' << a[i];
	cout << endl << "배열 b:";
	for(int i=0; i<10; i++)
		cout << ' ' << b[i];
	cout << endl;

	return 0;
}
배열 a: 7 7 2 4 7 2 4 2 8 6
배열 b: 7 7 7 7 5 7 7 7 8 6

 

[remove(arr_begin ,arr_end ,replace_before_value) : 해당 값을 지운다,

remove_if(arr_begin ,arr_end ,replace_after_value) : 조건에 해당되는 값을 지운다]

 

remove() 함수가 그것인데요, 이 함수를 쓰면 구간의 크기가 원래보다 줄어들 수 있습니다! 그래서 배열이나 벡터 전체가 아닌 중간에서 사용할 때는 상당히 주의해야 합니다. 삭제 연산 수행 후, 구간의 끝점의 주소 혹은 이터레이터를 반환합니다. 이걸 이용해서 줄어든 구간의 길이, 혹은 제거된 값의 개수를 알아내야 합니다. remove_if() 함수는 세 번째 매개변수가 값이 아니라 bool 타입 함수입니다.

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

bool isOdd(int n){
	return (n%2 == 1);
}

int main(){

	int a[10] = {1, 3, 2, 4, 5, 2, 4, 2, 8, 6};
	int b[10];
	int *p, *q;
	copy(a, a+10, b);
	p = remove(a, a+10, 2);
	q = remove_if(b, b+10, isOdd);
	
	cout << "배열 a:";
	for(int i=0; i<p-a; i++)
		cout << ' ' << a[i];
	cout << endl << "배열 b:";
	for(int i=0; i<q-b; i++)
		cout << ' ' << b[i];
	cout << endl;

	return 0;
}
배열 a: 1 3 4 5 4 8 6
배열 b: 2 4 2 4 2 8 6

 

배열 a는 값 2를 모두 지웠고, 배열 b는 홀수값을 모두 지우게 됩니다.

둘 다 값을 3개를 지우므로, 남은 구간의 크기는 7칸이 되지만, 실제로 배열은 아직 10칸의 자리를 남겨둡니다.

남은 구간을 반복문에서 돌기 위해선 저렇게 remove() 함수의 리턴값을 사용해야 합니다.

 

네, 예제는 제대로 출력됩니다. 하지만, remove() 함수는 배열 중간에만 적용했다고 해서

원래 구간 뒤쪽 값을 저절로 당겨주지도 않습니다. 알아서 해야 하죠. 따라서 사용하는 데 제약이 좀 많은 함수입니다.

 

출처: https://m.blog.naver.com/PostList.nhn?blogId=kks227&categoryNo=163&logCode=0