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 활용 가능 |
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 초급 - 11. 표준 라이브러리(STL) (3 - std::set, std::unordered_set (중복 없는 집합 컨테이너)) (0) | 2025.02.22 |
---|---|
C++ 초급 - 11. 표준 라이브러리(STL) (2 - std::map, std::unordered_map (연관 컨테이너)) (0) | 2025.02.22 |
C++ 초급 - 10. 예외 처리 (3 - 기본 예외 클래스 (std::exception, std::runtime_error)) (0) | 2025.02.22 |
C++ 초급 - 10. 예외 처리 (2 - throw 키워드 (예외 발생시키기)) (0) | 2025.02.22 |
C++ 초급 - 10. 예외 처리 (1 - try-catch 블록 (예외 처리의 기본 구조)) (0) | 2025.02.22 |