안녕하세요. 방수철입니다.
이번 글부터는 <algorithm> 에 추가된 기능들에 대해서 설명드리겠습니다.

STL 알고리즘 일반론

 STL 알고리즘은 다양한 자료구조에 적용할 수 있기 때문에 일반화 되어있다고 합니다. vector나 list같은 STL에 포함된 자료 구조뿐만 아니라 특정 알고리즘의 요구조건을 충족시키는 자료구조나 배열 또한 다룰 수 있습니다. STL 알고리즘은 반복자를 통해 간접적으로 자료구조의 각 요소에 접근함으로써 이런 수준의 일반성을 달성합니다.

 STL 알고리즘은 일반적으로 시작이나 끝 위치로 특정되는 반복자를 처리하게 되는데 참조되는 범위들은 반드시 유효해야 합니다. 또한 범위의 모든 위치는 반드시 역참조가능 해야하며, 각 범위의 역속된 요소들에서 처음부터 마지막 위치까지 반드시 증가 연산으로 도달 가능하여야 합니다.

 STL 알고리즘은 각 STL 자료구조의 연산자와 멤버 함수에 의해 지원되는 동작들을 확장하고, 동시에 다른 종류의 자료구조들 간에 동작하도록 합니다. 알고리즘의 목적을 전달하기 위해서 두가지 접미사가 사용되고 있습니다.

  • '_if' 접미사는 해당 알고리즘이 함수 객채와 같이 사용되는 것을 알려줍니다. 예를 들어 find와 find_if를 비교해보겠습니다. find는 조건으로 주어지는 값과 일치하는(설명의 편의상 일치하는 경우를 예를 들었습니다.) 요소를 찾는 알고리즘 입니다. 하지만 find_if를 사용할 경우 함수 객체를 인수로 전달하여, 그 함수에 의해서 참으로 처리되는 요소를 찾아 낼 수 있습니다. ( 예 : 짝수 찾기 )
  •  '_copy' 접미사는 해당 알고리즘이 자료 구조의 요소들을 다룰 뿐만 아니라 변경된 값을 목적 범위에 복사함을 알려줍니다. 예를 들어, reverse 알고리즘은 주어진 범위의 값들의 순서를 뒤집는 기능을 하지만 reverse_copy 알고리즘은 reverse의 기능과 함께 주어진 반복자의 위치에 뒤집힌 순서의 자료구조를 복사하게 됩니다.

 STL 알고리즘은 종종 목적이나 필요조건을 가리키는 그룹으로 분류됩니다. 그 중 한가지 분류법으로, 자료 구조의 내용이 변경되는 것과 그렇지 않은 것으로 나누는 것 입니다.

  • '변형시키는 알고리즘'은 값은 바꾸지 않지만 순서를 바꾸는 알고리즘입니다.
  • '제거하는 알고리즘'은 일정 범위의 요소들을 지우게 됩니다.
  • '정렬 알고리즘' 범위안의 요소들을 다양한 방법으로 재배치 하며,
  • '정렬된 범위 알고리즘'은 정렬된 범위에서만 동작하는 알고리즘 입니다.

 참고로, 수치 연산을 제공하는 STL 알고리즘은 따로 <numeric>이라는 헤더 파일이 존재하며, 함수 객체와 어댑터가 정의된 <functional> 헤더 파일이 있습니다. boolean을 반환하는 함수 객체는 predicate로 알려져 있습니다. 기본 바이너리 predicate는 비교연산자 < 이다. 일반적으로,  정렬되는 요소들은 대소비교가 가능하여 동등함이 판별될 수 있어야 합니다.

 다음 글들에서는 새로이 구체적으로 추가된 기능들을 몇 차례에 걸쳐 소개하도록 하겠습니다.