
- STL 컨테이너란?
- Standard Template Library
- 템플릿 기반으로 모든 컨테이너에 적용되는 표준 인터페이스
- 메모리 자동관리 -> 메모리 단편화
💡 std::vector 란?
- std::vector는 C++ STL에서 제공하는 동적 배열 컨테이너
- 배열처럼 인덱스로 접근이 가능하면서도, 크기를 유동적으로 조절할 수 있다.
- push_back() 등 다양한 메서드를 통해 요소 추가/삭제가 쉽고 직관적이다.
배열의 단점을 보완한, 가장 자주 쓰이는 컨테이너
📍 특징
특징 | 설명 |
연속된 메모리 공간 | 일반 배열처럼 빠른 접근(인덱스 접근 가능) - O(1) |
동적 크기 조절 | push_back, resize 등으로 자동 확장 |
다양한 멤버 함수 | insert, erase, clear, swap 등 |
범위 기반 반복 지원 | for (int x : vec) 문법 가능 |
중간 삽입/삭제는 느림 | vector는 중간 삽입 시 O(N) 시간 소요 |
vector<type>(size, value) | 사이즈, 초기화 가능 |
⏱️ 시간 복잡도
연산 | 시간복잡도 | 설명 |
v[i] / at(i) | O(1) | 인덱스 접근 |
push_back() / pop_back() | O(1) (암묵적 amortized) | 뒤쪽 삽입/삭제 |
insert() / erase() | O(N) | 중간 삽입/삭제 |
resize() / clear() | O(N) | 크기 변경 및 초기화 |
🧪 vector 선언 & 초기화
#include <vector>
// 빈 벡터 선언
std::vector<int> v1;
// 크기 5, 모든 값 0
std::vector<int> v2(5);
// 크기 5, 모든 값 10
std::vector<int> v3(5, 10);
// 초기화 리스트
std::vector<int> v4 = {1, 2, 3, 4, 5};
🧩 vector 주요 함수
함수설명시간복잡도
함수 | 설명 | 시간복잡도 |
push_back(x) | 뒤에 요소 삽입 | O(1) |
pop_back() | 마지막 요소 삭제 | O(1) |
insert(pos, x) | 중간에 삽입 | O(N) |
erase(pos) | 중간 요소 삭제 | O(N) |
clear() | 전체 초기화 | O(N) |
resize(n) | 크기 조정 | O(N) |
front() / back() | 맨 앞/뒤 요소 반환 | O(1) |
size() | 요소 개수 반환 | O(1) |
empty() | 벡터가 비었는지 확인 | O(1) |
at(i) | 안전한 i번째 접근 (예외 발생) | O(1) |
📍 vector 사용 예제
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec; // 빈 벡터
vector<int> vec2(5, 10); // [10, 10, 10, 10, 10]
vector<int> vec3 = {1, 2, 3}; // 초기화 리스트
vec.push_back(4); // [4]
vec.push_back(5); // [4, 5]
vec.pop_back(); // [4]
vec.insert(vec.begin() + 0, 100); // [100, 4]
vec.erase(vec.begin()); // [4]
cout << vec.front() << "\n"; // 4
cout << vec.back() << "\n"; // 4
cout << vec.at(0) << "\n"; // 4
cout << vec[0] << "\n"; // 4
vec.clear(); // 모든 요소 제거
return 0;
}
🔁 반복문으로 순회하기
cpp
복사편집
vector<int> v = {1, 2, 3, 4, 5};
// 1. 인덱스 기반
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
// 2. 범위 기반 for문 (C++11 이상)
for (int x : v) {
cout << x << " ";
}
// 3. 반복자 사용
for (auto it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
📍 자주 사용하는 패턴
- 정렬
sort(vec.begin(), vec.end());
- 2차원 벡터 선언
int n = 3, m = 4; vector<vector<int>> board(n, vector<int>(m, 0));
- 값 검색 (없는 경우 end() 반환)
auto it = find(vec.begin(), vec.end(), 3); if (it != vec.end()) cout << "Found!";
🔍 vector vs deque vs list
연산vectordequelist
연산 | vector | deque | list |
인덱스 접근 | ✅ 빠름 | ✅ 가능 | ❌ 느림 |
앞 삽입/삭제 | ❌ 느림 | ✅ 빠름 | ✅ 빠름 |
뒤 삽입/삭제 | ✅ 빠름 | ✅ 빠름 | ✅ 빠름 |
중간 삽입/삭제 | ❌ 느림 | ❌ 느림 | ✅ 빠름 |
메모리 구조 | 연속 | 분할 | 노드 연결 |
🔹 vector: 인덱스 접근과 뒤쪽 삽입이 많을 때
🔹 deque: 앞뒤 삽입이 많을 때
🔹 list: 중간 삽입/삭제가 많을 때
📍 vector를 잘 쓰기 위한 팁
- v.reserve(n)으로 미리 공간 확보하면 재할당을 줄여 성능 향상 가능
- v.at(i)는 예외 처리를 위해 디버깅에 유용
- v.shrink_to_fit()으로 메모리 절약 가능
🪄 마무리
✅ vector는 가장 자주 쓰이는 C++ STL 컨테이너
✅ 동적 배열로서 유연성과 성능을 동시에 제공
✅ 정렬, 탐색, 삽입, 삭제 등 대부분의 작업이 간단한 문법으로 구현
✅ 상황에 따라 deque, list 등과 비교해 효율적인 선택이 중요!
'C++' 카테고리의 다른 글
[C++] STL 컨테이너 - deque (Double-Ended Queue, 덱) (1) | 2025.02.19 |
---|---|
[C++] STL 컨테이너 - Queue 큐 (0) | 2025.02.17 |
[C++] STL 컨테이너 - Stack (0) | 2025.02.17 |