C++ 학습: 표준 템플릿 라이브러리 (STL)
표준 템플릿 라이브러리(STL)는 C++ 프로그래밍에서 자주 사용되는 데이터 구조와 알고리즘을 제공하는 강력한 라이브러리입니다. 이번 글에서는 컨테이너, 이터레이터, 알고리즘, 함수 객체와 람다 표현식에 대해 알아보겠습니다.
1. 컨테이너: 벡터, 리스트, 데크, 셋, 맵 등
STL 컨테이너는 데이터를 저장하고 관리하는 데 사용되는 클래스 템플릿입니다. 주요 컨테이너는 다음과 같습니다.
1. 벡터(vector) : 동적 배열로, 크기가 자동으로 조정됩니다.
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
vec.push_back(6); // 요소 추가
for (int i : vec) {
cout << i << " ";
}
cout << endl;
return 0;
}
2. 리스트(list) : 이중 연결 리스트로, 요소의 삽입과 삭제가 빠릅니다.
#include <list>
using namespace std;
int main() {
list<int> lst = {1, 2, 3, 4, 5};
lst.push_back(6); // 요소 추가
for (int i : lst) {
cout << i << " ";
}
cout << endl;
return 0;
}
3. 데크(deque) : 양쪽 끝에서 삽입과 삭제가 가능한 덱(데크)입니다.
#include <deque>
using namespace std;
int main() {
deque<int> deq = {1, 2, 3, 4, 5};
deq.push_front(0); // 앞에 요소 추가
deq.push_back(6); // 뒤에 요소 추가
for (int i : deq) {
cout << i << " ";
}
cout << endl;
return 0;
}
4. 셋(set) : 중복되지 않는 정렬된 요소의 집합입니다.
#include <set>
using namespace std;
int main() {
set<int> s = {3, 1, 4, 1, 5, 9};
s.insert(2); // 요소 추가
for (int i : s) {
cout << i << " ";
}
cout << endl;
return 0;
}
5. 맵(map) : 키와 값의 쌍으로 구성된 연관 컨테이너입니다.
#include <map>
using namespace std;
int main() {
map<string, int> m;
m["Alice"] = 25;
m["Bob"] = 30;
for (auto &p : m) {
cout << p.first << ": " << p.second << endl;
}
return 0;
}
2. 이터레이터: 이터레이터의 개념과 사용
이터레이터는 컨테이너의 요소를 순회하기 위한 객체입니다. 포인터와 유사하게 동작하며, STL 컨테이너와 함께 사용됩니다.
이터레이터 사용 예제
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
vector<int>::iterator it;
for (it = vec.begin(); it != vec.end(); ++it) {
cout << *it << " ";
}
cout << endl;
return 0;
}
위의 예제에서 이터레이터 it를 사용하여 벡터 vec의 요소를 순회하고 출력합니다.
3. 알고리즘: 정렬, 검색, 수치 알고리즘
STL은 다양한 알고리즘을 제공하여 데이터 조작을 용이하게 합니다. 주요 알고리즘에는 정렬, 검색, 수치 알고리즘이 있습니다.
1. 정렬
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> vec = {5, 3, 1, 4, 2};
sort(vec.begin(), vec.end()); // 오름차순 정렬
for (int i : vec) {
cout << i << " ";
}
cout << endl;
return 0;
}
2. 검색
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
if (binary_search(vec.begin(), vec.end(), 3)) {
cout << "3 found in the vector." << endl;
} else {
cout << "3 not found in the vector." << endl;
}
return 0;
}
3. 수치 알고리즘
#include <vector>
#include <numeric>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
int sum = accumulate(vec.begin(), vec.end(), 0); // 요소의 합
cout << "Sum: " << sum << endl;
return 0;
}
4. 함수 객체와 람다 표현식: 함수 객체의 사용과 람다 표현식
함수 객체와 람다 표현식은 C++에서 함수형 프로그래밍을 지원하는 기능입니다.
함수 객체
함수 객체는 함수처럼 동작하는 객체로, 연산자 오버로딩을 통해 구현됩니다.
#include <algorithm>
#include <vector>
using namespace std;
class Increment {
public:
int operator()(int x) const {
return x + 1;
}
};
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
vector<int> result(vec.size());
transform(vec.begin(), vec.end(), result.begin(), Increment());
for (int i : result) {
cout << i << " ";
}
cout << endl;
return 0;
}
람다 표현식
람다 표현식은 익명 함수로, 간단한 함수를 즉석에서 정의할 수 있습니다.
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
vector<int> result(vec.size());
transform(vec.begin(), vec.end(), result.begin(), [](int x) { return x + 1; });
for (int i : result) {
cout << i << " ";
}
cout << endl;
return 0;
}
위의 예제에서 람다 표현식을 사용하여 벡터의 각 요소를 1씩 증가시킵니다. 람다 표현식은 []로 시작하며, 매개변수와 함수 본체를 포함합니다.
이번 글에서는 C++의 표준 템플릿 라이브러리(STL)에 대해 알아보았습니다. 컨테이너, 이터레이터, 알고리즘, 함수 객체와 람다 표현식을 이해하고 활용하면 보다 효율적이고 강력한 C++ 코드를 작성할 수 있습니다. 다음 단계에서는 파일 스트림, 읽기와 쓰기 등 파일 입출력에 대해 학습해보세요. Happy Coding!
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 10. C++의 "예외 처리" (1) | 2024.06.17 |
---|---|
[C++] 9. C++의 "파일 입출력" (0) | 2024.06.17 |
[C++] 7. C++의 "객체 지향 프로그래밍" (0) | 2024.06.17 |
[C++] 6. C++의 "구조체와 클래스" (0) | 2024.06.17 |
[C++] 5. C++의 "포인터와 참조" (0) | 2024.06.14 |