본문 바로가기
프로그래밍/C++

[C++] 8. C++의 "표준 템플릿 라이브러리 (STL)"

by iwbap 2024. 6. 17.
728x90

C++ 학습: 표준 템플릿 라이브러리 (STL)

표준 템플릿 라이브러리(STL)는 C++ 프로그래밍에서 자주 사용되는 데이터 구조와 알고리즘을 제공하는 강력한 라이브러리입니다. 이번 글에서는 컨테이너, 이터레이터, 알고리즘, 함수 객체와 람다 표현식에 대해 알아보겠습니다.


1. 컨테이너: 벡터, 리스트, 데크, 셋, 맵 등

STL 컨테이너는 데이터를 저장하고 관리하는 데 사용되는 클래스 템플릿입니다. 주요 컨테이너는 다음과 같습니다.

 

1. 벡터(vector) : 동적 배열로, 크기가 자동으로 조정됩니다.

[cpp]
 
#include <iostream>
#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) : 이중 연결 리스트로, 요소의 삽입과 삭제가 빠릅니다.

[cpp]
 
#include <iostream>
#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) : 양쪽 끝에서 삽입과 삭제가 가능한 덱(데크)입니다.

[cpp]
 
#include <iostream>
#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) : 중복되지 않는 정렬된 요소의 집합입니다.

[cpp]
 
#include <iostream>
#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) : 키와 값의 쌍으로 구성된 연관 컨테이너입니다.

[cpp]
 
#include <iostream>
#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 컨테이너와 함께 사용됩니다.

 

이터레이터 사용 예제

[cpp]
 
#include <iostream>
#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. 정렬

[cpp]
 
#include <iostream>
#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. 검색

[cpp]
 
#include <iostream>
#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. 수치 알고리즘

[cpp]
 
#include <iostream>
#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++에서 함수형 프로그래밍을 지원하는 기능입니다.

 

함수 객체

함수 객체는 함수처럼 동작하는 객체로, 연산자 오버로딩을 통해 구현됩니다.

[cpp]
 
#include <iostream>
#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;
}
 
 

람다 표현식

람다 표현식은 익명 함수로, 간단한 함수를 즉석에서 정의할 수 있습니다.

[cpp]
 
#include <iostream>
#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!

728x90