STL 개요 및 철학
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 70번째.
표준 템플릿 라이브러리(STL)는 일반적인 데이터 구조와 알고리즘을 제공하는 템플릿 기반 클래스 및 함수의 집합입니다. 여러분이 배운 템플릿 개념을 바탕으로 구축된 STL은 데이터 저장과 데이터 조작을 분리한다는 강력한 설계 철학을 구현합니다.
STL은 함께 작동하는 세 가지 핵심 구성 요소를 중심으로 구성됩니다:
| 구성 요소 | 목적 | 예시 |
|---|---|---|
| 컨테이너 | 객체 컬렉션 저장 | vector, map, set |
| 반복자 | 컨테이너 요소에 대한 접근 제공 | 입력, 출력, 임의 접근 |
| 알고리즘 | 데이터에 대한 작업 수행 | sort, find, transform |
핵심적인 통찰은 알고리즘이 컨테이너에 대해 직접적으로 알지 못한다는 것입니다. 알고리즘은 반복자(iterator)를 통해 작동합니다. 이는 단일 sort 알고리즘이 벡터, 배열 및 적절한 반복자 타입을 제공하는 모든 컨테이너와 함께 작동함을 의미합니다:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
std::sort(nums.begin(), nums.end());
for (int n : nums) {
std::cout << n << " ";
}
// Output: 1 2 5 8 9
}이러한 분리는 새로운 코드를 작성하지 않고도 호환되는 모든 컨테이너와 함께 모든 알고리즘을 조합하여 사용할 수 있음을 의미합니다. STL은 실전에서 검증되고 최적화된 구현을 제공하므로, 일반적인 데이터 구조를 직접 구현하는 대신 문제 해결에 집중할 수 있습니다.
챌린지
쉬움컨테이너, 반복자(iterator), 알고리즘을 분리하는 STL의 철학을 보여주는 간단한 데이터 처리 시스템을 구축해 보겠습니다. STL 컴포넌트와 함께 작동하는 유틸리티 모듈과 이러한 조각들이 어떻게 결합되는지 보여주는 메인 프로그램을 만들 것입니다.
두 개의 파일을 생성하게 됩니다:
DataProcessor.h: 반복자를 통해 STL 컨테이너와 함께 작동하는 유틸리티 함수를 정의하여 STL의 설계 철학을 보여줍니다.std::vector<int>&를 인자로 받아 모든 요소를 공백으로 구분하여 출력하고 줄바꿈을 수행하는printVector함수를 만드세요. 컨테이너를 순회할 때는 반복자(begin()및end())를 사용하세요.std::vector<int>&를 인자로 받아std::sort를 사용하여 정렬한 다음, 정렬된 요소를 공백으로 구분하여 출력하고 줄바꿈을 수행하는sortAndPrint함수를 만드세요.std::vector<int>&와 검색할int값을 인자로 받는findElement함수를 만드세요.std::find를 사용하여 요소를 찾으세요. 요소를 찾으면Found: <value>를 출력하고, 찾지 못하면Not found: <value>를 출력하세요.std::vector<int>&를 인자로 받아 모든 요소의 합계를 반환하는getSum함수를 만드세요. 이를 위해 반복자를 사용한 간단한 루프를 사용할 수 있습니다.main.cpp: 입력을 읽고 STL 컴포넌트가 어떻게 함께 작동하는지 보여줍니다.다섯 개의 입력을 읽습니다 (각각 별도의 줄에 입력됨):
- 첫 번째 정수
- 두 번째 정수
- 세 번째 정수
- 네 번째 정수
- 검색할 값
std::vector<int>를 생성하고 처음 네 개의 정수를 추가합니다. 그런 다음 다음을 통해 STL 철학을 보여줍니다:Original:을 출력한 후printVector호출Sorted:를 출력한 후sortAndPrint호출- 검색 값을 사용하여
findElement호출 getSum을 사용하여Sum: <result>출력
예를 들어, 입력값이 5, 2, 8, 1, 8인 경우:
Original: 5 2 8 1
Sorted: 1 2 5 8
Found: 8
Sum: 16입력값이 10, 30, 20, 40, 15인 경우:
Original: 10 30 20 40
Sorted: 10 20 30 40
Not found: 15
Sum: 100여러분이 만든 함수가 반복자를 통해 벡터와 어떻게 상호작용하는지, 그리고 std::sort와 std::find가 적절한 반복자 타입을 제공하는 모든 컨테이너에서 어떻게 작동하는지 주목해 보세요. 이것이 바로 STL 설계의 힘입니다. 알고리즘은 컨테이너와 분리되어 있으며, 오직 반복자를 통해서만 연결됩니다.
직접 해보기
#include <iostream>
#include <vector>
#include "DataProcessor.h"
using namespace std;
int main() {
// 입력으로부터 다섯 개의 정수를 읽습니다
int num1, num2, num3, num4, searchValue;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> num4;
cin >> searchValue;
// TODO: vector를 생성하고 처음 네 개의 정수를 여기에 추가합니다
// TODO: "Original: "을 출력하고 printVector를 호출합니다
// TODO: "Sorted: "를 출력하고 sortAndPrint를 호출합니다
// TODO: searchValue와 함께 findElement를 호출합니다
// TODO: "Sum: "을 출력한 뒤 getSum의 결과를 출력합니다
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.