C++ STL 배열 알고리즘이란?
C++11 표준이 도입되면서 STL(표준 템플릿 라이브러리)에는 컨테이너와 배열을 더욱 편리하게 다룰 수 있는 다양한 함수들이 추가되었습니다. 이 함수들은 대부분 <algorithm> 헤더 파일에 정의되어 있으며, 복잡한 반복문을 직접 작성하지 않고도 조건 검사, 요소 복사, 값 초기화 등을 간결하게 처리할 수 있습니다.
이 글에서는 실무에서 자주 활용되는 대표적인 배열 알고리즘 함수들을 예제 코드와 함께 하나씩 살펴보겠습니다.
1. all_of() – 모든 요소가 조건을 만족하는지 확인
all_of() 함수는 컨테이너의 모든 요소가 특정 조건을 만족하는지 검사합니다. 모든 요소가 조건을 충족하면 true를 반환하고, 단 하나라도 만족하지 않으면 false를 반환합니다.
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int arr[] = {2, 4, 6, 8, 10};
int n = sizeof(arr)/sizeof(arr[0]);
if(all_of(arr, arr + n, [](int x){return x % 2 == 0;})) {
cout << "All are even";
} else {
cout << "All are not even";
}
}
실행 결과:
All are even
위 예제에서는 람다 함수를 사용해 배열의 모든 요소가 짝수인지 확인합니다. 배열 {2, 4, 6, 8, 10}은 전부 짝수이므로 "All are even"이 출력됩니다.
2. any_of() – 하나라도 조건을 만족하는지 확인
any_of() 함수는 컨테이너의 요소 중 최소 하나 이상이 특정 조건을 만족하는지 검사합니다. 조건을 만족하는 요소가 하나라도 존재하면 true를 반환합니다.
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int arr[] = {2, 4, 6, 8, 10, 5, 62};
int n = sizeof(arr)/sizeof(arr[0]);
if(any_of(arr, arr + n, [](int x){return x % 2 == 1;})) {
cout << "At least one element is odd";
} else {
cout << "No odd elements are found";
}
}
실행 결과:
At least one element is odd
배열에 홀수인 5가 포함되어 있으므로 조건을 만족하는 요소가 존재한다는 메시지가 출력됩니다.
3. none_of() – 조건을 만족하는 요소가 없는지 확인
none_of() 함수는 컨테이너의 어떤 요소도 주어진 조건을 만족하지 않는지 검사합니다. 조건을 만족하는 요소가 전혀 없을 때 true를 반환합니다.
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int arr[] = {2, 4, 6, 8, 10, 5, 62};
int n = sizeof(arr)/sizeof(arr[0]);
if(none_of(arr, arr + n, [](int x){return x < 0;})) {
cout << "All elements are positive";
} else {
cout << "Some elements are negative";
}
}
실행 결과:
All elements are positive
배열의 모든 요소가 양수이므로 음수인 요소가 없다는 판정에 따라 "All elements are positive"가 출력됩니다.
4. copy_n() – 지정한 개수만큼 요소 복사
copy_n() 함수는 한 배열(또는 컨테이너)의 요소를 지정한 개수만큼 다른 배열로 복사할 때 사용합니다. 원본 배열의 일부 또는 전체를 손쉽게 복제할 수 있습니다.
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int arr[] = {2, 4, 6, 8, 10, 5, 62};
int n = sizeof(arr)/sizeof(arr[0]);
int arr2[n];
copy_n(arr, n, arr2);
for(int i = 0; i < n; i++) {
cout << arr2[i] << " ";
}
}
실행 결과:
2 4 6 8 10 5 62
copy_n(원본 시작 주소, 복사할 개수, 대상 시작 주소) 형태로 호출하며, 위 예제에서는 arr의 전체 요소 n개가 arr2로 그대로 복사됩니다.
5. iota() – 연속된 값으로 배열 초기화
iota() 함수는 배열에 시작값부터 1씩 증가하는 연속된 값을 순서대로 할당합니다. 이 함수는 다른 함수들과 달리 <numeric> 헤더 파일에 정의되어 있으며, 배열 이름(시작 주소), 끝 주소, 시작값 세 가지 인자를 받습니다.
#include <iostream>
#include <numeric>
using namespace std;
int main() {
int n = 10;
int arr[n];
iota(arr, arr + n, 10);
for(int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
}
실행 결과:
10 11 12 13 14 15 16 17 18 19
시작값 10부터 차례대로 1씩 증가한 값들이 배열에 채워집니다. 인덱스 기반 초기화가 필요한 경우 반복문 없이 깔끔하게 처리할 수 있습니다.
함수별 특징 요약
| 함수 | 헤더 파일 | 설명 |
|---|---|---|
| all_of() | <algorithm> | 모든 요소가 조건을 만족하면 true 반환 |
| any_of() | <algorithm> | 하나 이상의 요소가 조건을 만족하면 true 반환 |
| none_of() | <algorithm> | 조건을 만족하는 요소가 없으면 true 반환 |
| copy_n() | <algorithm> | n개의 요소를 다른 배열로 복사 |
| iota() | <numeric> | 시작값부터 연속된 값으로 배열 채우기 |
마무리
C++11에서 추가된 이러한 STL 알고리즘 함수들을 활용하면 조건 검사, 배열 복사, 초기화 같은 반복적인 작업을 훨씬 간결하고 가독성 높은 코드로 작성할 수 있습니다. 직접 반복문을 구현하는 것보다 버그 발생 가능성도 줄어들기 때문에, 실무 코드에서 적극적으로 활용해 보시기 바랍니다.