본문 바로가기
C++

C++ STL알고리즘

by FraisGout 2020. 7. 5.

함수 객체(function object)

STL 알고리즘에 데이터를 전달하기 위해서는 다음과 같은 방법을 사용할 수 있습니다.

 

 

 

1. 함수 포인터

 

2. 함수 객체

 

3. 람다 표현식

 

 

 

많은 STL 알고리즘이 데이터를 처리하기 위해 매개변수로 함수 객체(function object)를 받아들입니다.

 

펑크터(functor)라고도 불리는 함수 객체는 호출 연산자(())와 함께 사용할 수 있는 객체를 의미합니다.

 

이러한 함수 객체는 우선 타입을 선언하고, 해당 클래스에서 호출 연산자(())를 오버로딩하여 구현하게 됩니다.

 

함수 객체의 장점

직접적인 함수 호출과 비교하여 함수 객체를 사용하면 다음과 같은 장점을 가집니다.

 

 

 

1. 함수 객체는 상태(state)를 포함할 수 있습니다.

 

2. 함수 객체는 타입이므로, 템플릿 인수로 사용할 수 있습니다.

 

미리 정의된 함수 객체

STL은 자주 사용할만한 연산에 대해 몇 가지 기본적인 함수 객체를 미리 정의하여 제공하고 있습니다.

 

이러한 미리 정의된 함수 객체는 함수를 매개변수로 전달받는 STL 함수를 지원하기 위해 제공됩니다.

 

이러한 함수 객체는 functional 헤더 파일에 정의되어 있습니다.

 

 

 

STL에서는 다음과 같은 함수 객체를 미리 정의하여 제공하고 있습니다.

 

함수 객체

연산자

함수 객체

연산자

plus

+

greater

>

minus

-

greater_equal

>=

multiplies

*

less

<

divides

/

less_equal

<=

modulus

%

logical_and

&&

negate

-

logical_or

||

equal_to

==

logical_not

!

not_equal_to

!=

 

 

 

 

 

다음 예제는 함수 객체를 사용하여 일반적인 산술 연산 및 관계 연산을 구현한 예제입니다.

 

예제

plus<int> add;

 

equal_to<int> comp;

 

greater_equal<int> ge;

 

 

 

cout << add(7, 3) << endl;

 

cout << comp(7, 3) << endl;

 

cout << ge(7, 3);

 

함수 객체는 일반적으로 위와 같이 사용하지는 않으며, 보통 함수의 인수로 전달될 때 사용됩니다.

 

 

 

다음 예제는 greaterless 함수 객체를 각각 sort() 함수의 인수로 전달하여 사용하는 예제입니다.

 

예제

vector<int> vc = {20, 40, 10, 30}; // vector 객체의 선언 및 초기화

 

 

 

sort(vc.begin(), vc.end(), greater<int>());

 

copy(vc.begin(), vc.end(), ostream_iterator<int>(cout, " "));

 

cout << endl;

 

 

 

sort(vc.begin(), vc.end(), less<int>());

 

copy(vc.begin(), vc.end(), ostream_iterator<int>(cout, " "));

 

 

STL 알고리즘 함수

STL의 목적은 일반적인 알고리즘에 대한 효율적인 구현을 제공하는 것입니다.

 

따라서 STL은 이러한 알고리즘을 STL 알고리즘 함수나 STL 컨테이너의 멤버 함수를 사용하여 구현하고 있습니다.

 

 

 

STL 컨테이너는 반드시 필요한 기능만을 포함하고 있으며, 동작하는데 필요한 모든 기능을 가지고 있지는 않습니다.

 

따라서 STL 컨테이너는 알고리즘을 제공하는 많은 전역 함수와 함께 사용해야만 제 기능을 발휘할 수 있습니다.

 

이렇게 제공되는 STL 알고리즘 함수는 반복자를 통해 임의의 컨테이너에 같은 방법으로 적용됩니다.

 

 

 

대부분의 알고리즘 함수는 algorithm 헤더 파일과 numeric 헤더 파일에 정의되어 있습니다.

 

STL 알고리즘의 분류

STL 알고리즘은 기능별로 다음과 같이 구분할 수 있습니다.

 

 

 

1. 읽기 알고리즘(algorithm 헤더 파일)

 

2. 변경 알고리즘(algorithm 헤더 파일)

 

3. 정렬 알고리즘(algorithm 헤더 파일)

 

4. 수치 알고리즘(numeric 헤더 파일)

 

읽기 알고리즘

STL 읽기 알고리즘 함수는 컨테이너를 변경하지 않으며, 컨테이너의 지정된 범위에서 특정 데이터를 읽기만 하는 함수입니다.

 

STL에서 제공하는 대표적인 읽기 알고리즘 함수는 다음과 같습니다.

 

 

 

1. find()

 

2. for_each()

 

 

 

find() 함수는 두 개의 입력 반복자로 지정된 범위에서 특정 값을 가지는 첫 번째 요소를 가리키는 입력 반복자를 반환합니다.

 

for_each() 함수는 두 개의 입력 반복자로 지정된 범위의 모든 요소를 함수 객체에 대입한 후, 대입한 함수 객체를 반환합니다.

 

변경 알고리즘

STL 변경 알고리즘 함수는 컨테이너를 변경하지 않으며, 컨테이너의 지정된 범위에서 요소의 값만을 변경할 수 있는 함수입니다.

 

STL에서 제공하는 대표적인 변경 알고리즘 함수는 다음과 같습니다.

 

 

 

1. copy()

 

2. swap()

 

3. transform()

 

 

 

copy() 함수는 두 개의 입력 반복자로 지정된 범위의 모든 요소를 출력 반복자가 가리키는 위치에 복사합니다.

 

swap() 함수는 두 개의 참조가 가리키는 위치의 값을 서로 교환합니다.

 

transform() 함수는 두 개의 입력 반복자로 지정된 범위의 모든 요소를 함수 객체에 대입한 후, 출력 반복자가 가리키는 위치에 복사합니다.

 

정렬 알고리즘

STL 정렬 알고리즘 함수는 컨테이너의 지정된 범위의 요소들이 정렬되도록 컨테이너를 변경하는 함수입니다.

 

모든 정렬 알고리즘 함수는 올바른 정렬을 위해 임의 접근 반복자를 사용합니다.

 

따라서 임의 접근이 가능한 컨테이너만이 사용할 수 있습니다.

 

 

 

STL에서 제공하는 대표적인 정렬 알고리즘 함수는 다음과 같습니다.

 

 

 

1. sort()

 

2. stable_sort()

 

3. binary_search()

 

 

 

sort() 함수는 두 개의 임의 접근 반복자로 지정된 범위의 모든 요소를 서로 비교하여, 오름차순으로 정렬합니다.

 

stable_sort() 함수는 두 개의 임의 접근 반복자로 지정된 범위의 모든 요소를 서로 비교하여, 값이 서로 같은 요소들의 상대적인 순서는 유지하면서 오름차순으로 정렬합니다.

 

binary_search() 함수는 sort() 함수를 사용하여 오름차순으로 정렬한 후에, 전달된 값과 같은 값이 있으면 참(true)을 반환하고 없으면 거짓(false)을 반환합니다.

 

수치 알고리즘

수치 알고리즘 함수는 다른 알고리즘 함수와는 달리 numeric 헤더 파일에 정의되어 있습니다.

 

대표적인 수치 알고리즘 함수는 다음과 같습니다.

 

 

 

1. accumulate()

 

 

 

accumulate() 함수는 두 개의 입력 반복자로 지정된 범위의 모든 요소의 합을 반환합니다.

 

 

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

C++ 예외처리  (0) 2020.07.06
C++ 입력 & 출력  (0) 2020.07.06
C++ STL컨테이너  (0) 2020.07.05
C++ STL반복자  (0) 2020.07.05
C++ 템플릿  (0) 2020.07.05

댓글