컴퓨터공학/C++

[C++] #include <algorithm>

Pyxis 2024. 11. 17. 12:26

[ C++ : #include <algorithm> ]

 

find
find_if
count
count_if
all_of
any_of
none_of
for_each
remove
remove_if

 

STL의 사용함에 있어서 장점은, 일반화된 함수를 쓴다면 다른 프로그래머가 쓴 코드를 봐도, 어떤 기능을 하는지 한 눈에 파악하기 쉬울 뿐더러, 컨테이너가 바뀌어도 그대로 동작한다는 것.

 

[1] find

number와 동일한 element가 존재하는지 탐색

auto itFind = ::find(v.begin(), v.end(), number);

 

[2] find_if

Predicate의 조건에 맞는 element가 존재하는지 탐색

auto itFind = ::find_if(v.begin(), v.end(), [](const int N) { return (N % 11) == 0; });

 

아래부터 나오는 함수들은 이제 find, find_if와 비슷하다고 보면 된다.

 

[3] count_if

struct IsOdd
{
	bool operator()(int N)
	{
		return (N % 2) != 0;
	}
};

int cnt = ::count_if(v.begin(), v.end(), IsOdd());

 

 

[4] all_of, any_of, none_of

// 모든 데이터가 홀수인가요?
bool b1 = ::all_of(v.begin(), v.end(), IsOdd());

// 홀수인 데이터가 하나라도 있나요?
bool b2 = ::any_of(v.begin(), v.end(), IsOdd());

// 모든 데이터가 홀수가 아닌가요?
bool b3 = ::none_of(v.begin(), v.end(), IsOdd());

 

[5] for_each

전부 순회해서, 세 번째 인자에 들어간 함수 객체 실행

::for_each(v.begin(), v.end(), MultiplyBy3());

 

==== ==== ==== ==== ==== ==== ==== ====

 

 

[6] remove, remove_if

유의해야할 점은, remove해야할 element를 직접 삭제하는 것이 아니라, 오른쪽에 밀어두고 결과적으로 남는 데이터들만 좌측에 남겨두는 방식으로 동작함.

return하는 iterator는 더 이상 사용되지 않는 데이터들의 첫번째를 가리킴.

auto it = ::remove_if(v.begin(), v.end(), IsOdd());
v.erase(it, v.end()); // 명시적으로 삭제하는 추가적인 작업 필요, 뒷부분만 삭제하므로 효율적

 

[7] unique

remove와 동일하다. unique한 데이터들만 좌측에 남겨두고, 우측에는 중복되는 남은 값들이 남아있으니 호출 후에는 erase()를 통해 명시적으로 삭제해줘야 한다.

'컴퓨터공학 > C++' 카테고리의 다른 글

[C++] 함수 객체, 콜백 함수  (0) 2024.11.19
[More Effective C++] 다중 상속  (0) 2024.11.17
[C++] 함수 포인터  (0) 2024.11.13
[C++] using  (0) 2024.11.09
[C++] noexcept  (0) 2024.11.09