C++ 초급 - 11. 표준 라이브러리(STL) (1 - std::vector, std::array (동적 및 정적 배열))

2025. 2. 22. 17:34프로그래밍 언어/C++

📌 11. 표준 라이브러리(STL)

C++ 표준 템플릿 라이브러리(STL, Standard Template Library)효율적인 데이터 구조와 알고리즘을 제공하는 강력한 라이브러리이다.
이를 활용하면 자료구조를 직접 구현할 필요 없이 효율적인 컨테이너와 알고리즘을 사용할 수 있다.


📌 11.1 std::vector, std::array (동적 및 정적 배열)

C++에서 배열을 다룰 때 크기를 동적으로 조절할 수 있는 std::vector고정 크기를 가지는 std::array를 사용할 수 있다.
이들은 STL 컨테이너로 강력한 기능을 제공하며, 배열보다 안전하고 유용하게 활용 가능하다.


📌 1. std::vector 개념 및 동적 크기 조절

🔹 (1) std::vector란?

  • 동적 배열 컨테이너로 크기를 자동으로 조절할 수 있음.
  • 배열과 달리 실행 중 크기 조정 가능 (push_back, resize).
  • 메모리를 자동 관리하여 new/delete 필요 없음.

💡 기본 문법

#include <vector>

std::vector<int> v;  // 정수형 벡터 선언 (초기 크기 없음)
std::vector<int> v2 = {1, 2, 3, 4, 5};  // 초기화 리스트
std::vector<int> v3(10, 42);  // 크기 10, 모든 요소를 42로 초기화

📌 2. std::vector의 주요 함수 (push_back, pop_back, size, at)

🔹 (1) 주요 메서드

함수  설명
push_back(value) 벡터의 끝에 요소 추가
pop_back() 벡터의 마지막 요소 제거
size() 현재 저장된 요소 개수 반환
at(index) 인덱스로 요소 접근 (배열처럼 사용 가능)
clear() 모든 요소 제거
empty() 벡터가 비었는지 확인 (true 또는 false)

💡 예제: std::vector의 주요 함수 활용

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v;

    v.push_back(10);
    v.push_back(20);
    v.push_back(30);

    std::cout << "벡터 크기: " << v.size() << std::endl;  // 3
    std::cout << "2번째 요소: " << v.at(1) << std::endl;  // 20

    v.pop_back();  // 마지막 요소 제거

    std::cout << "마지막 요소 제거 후 크기: " << v.size() << std::endl;  // 2

    return 0;
}

🔹 출력 결과

벡터 크기: 3
2번째 요소: 20
마지막 요소 제거 후 크기: 2

📌 3. std::array 개념 및 크기 고정 배열

🔹 (1) std::array란?

  • 배열과 유사하지만 std::array는 STL 컨테이너이므로 다양한 기능 제공.
  • 크기가 고정되며 std::vector처럼 동적 크기 조정 불가.
  • 성능이 중요하고 크기가 고정된 데이터를 다룰 때 유용.

💡 기본 문법

#include <array>

std::array<int, 5> arr = {1, 2, 3, 4, 5};  // 크기 5, 초기화

🔹 (2) std::array 주요 함수

함수 설명
size() 배열 크기 반환
at(index) 특정 인덱스의 요소 접근
front() 첫 번째 요소 반환
back() 마지막 요소 반환

💡 예제: std::array 기본 사용법

#include <iostream>
#include <array>

int main() {
    std::array<int, 4> arr = {10, 20, 30, 40};

    std::cout << "배열 크기: " << arr.size() << std::endl;  // 4
    std::cout << "첫 번째 요소: " << arr.front() << std::endl;  // 10
    std::cout << "마지막 요소: " << arr.back() << std::endl;  // 40

    return 0;
}

🔹 출력 결과

배열 크기: 4
첫 번째 요소: 10
마지막 요소: 40

📌 4. std::vector vs std::array 차이점

비교 항목 std::vector std::array
크기 조정 가능 (push_back, resize) 불가능 (고정 크기)
메모리 할당 동적 할당 (heap) 정적 할당 (stack)
성능 크기가 변하는 경우 유용 고정 크기 데이터에서 빠름
유연성 크기 변경 가능하여 일반적으로 더 자주 사용 성능이 중요한 경우 사용

💡 언제 std::vector vs std::array를 사용할까?

  • 동적 크기 조절이 필요하면 std::vector 사용.
  • 고정 크기 배열이 필요하고 성능이 중요하면 std::array 사용.

📌 5. 반복문을 활용한 컨테이너 순회

🔹 (1) for 루프 활용

  • 배열과 유사하게 size()를 활용하여 for 루프로 순회 가능.

💡 예제: std::vector와 std::array 순회

#include <iostream>
#include <vector>
#include <array>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};
    std::array<int, 5> arr = {10, 20, 30, 40, 50};

    std::cout << "std::vector 순회: ";
    for (size_t i = 0; i < v.size(); i++) {
        std::cout << v[i] << " ";
    }
    std::cout << std::endl;

    std::cout << "std::array 순회: ";
    for (size_t i = 0; i < arr.size(); i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

🔹 출력 결과

std::vector 순회: 1 2 3 4 5
std::array 순회: 10 20 30 40 50

🔹 (2) range-based for 활용 (C++11 이상)

  • C++11부터 range-based for를 활용하여 더 간결하게 순회 가능.

💡 예제: range-based for 사용

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};

    std::cout << "range-based for 활용: ";
    for (int x : v) {
        std::cout << x << " ";
    }
    std::cout << std::endl;

    return 0;
}

🔹 출력 결과

range-based for 활용: 1 2 3 4 5

📌 6. 정리

개념  설명
std::vector 동적 배열, 크기 조정 가능, push_back, pop_back 제공
std::array 고정 크기 배열, size(), at() 제공, std::vector보다 빠름
차이점 std::vector는 동적 메모리 할당, std::array는 정적 메모리 할당
컨테이너 순회 for 루프, range-based for 활용 가능