C++ 표준 라이브러리의
vector는 동적 배열을 구현한 시퀀스 컨테이너로, 크기가 자동으로 조절되는 가변 길이 배열입니다. 연속된 메모리 공간에 요소를 저장하므로 인덱스 기반 접근이 상수 시간에 가능하며, 필요에 따라 자동으로 저장 공간을 확장합니다.
기본 사용 준비
사용 전 해당 헤더를 포함해야 합니다.
#include <vector>
다양한 생성 및 초기화 방식
다음은 vector를 선언하고 초기화하는 여러 방법입니다. 요소 타입에 따라 기본값이 다르게 설정됩니다.
std::vector<int> nums; // 빈 벡터
std::vector<double> scores(5); // 5개 요소, 값은 0.0
std::vector<std::string> names(3, "default"); // 3개의 "default" 문자열
std::vector<int> values = {10, 20, 30, 40}; // 초기화 리스트
std::vector<int> copied(values); // 다른 벡터로 복사
std::vector<std::vector<int>> matrix(2, std::vector<int>(3, 0)); // 2×3 행렬
요소 추가 전략
새로운 요소를 추가할 때는 push_back 멤버 함수를 사용합니다. 이 함수는 컨테이너의 끝에 요소를 추가하며, 저장 공간이 부족하면 자동으로 재할당합니다.
std::vector<int> data;
for (int idx = 0; idx < 15; ++idx) {
data.push_back(idx * 10);
}
주의할 점은, operator[]나 at()으로 존재하지 않는 위치에 값을 대입할 수 없다는 것입니다. 다음 코드는 정의되지 않은 동작을 초래합니다.
std::vector<int> empty;
empty[0] = 5; // 오류! 메모리가 할당되지 않음
요소 순회 기법
인덱스 기반 접근
for (size_t pos = 0; pos < data.size(); ++pos) {
std::cout << data[pos] << " ";
}
반복자를 활용한 순회
std::vector<std::string> words = {"hello", "world", "from", "cpp"};
// 정방향 순회
for (auto it = words.begin(); it != words.end(); ++it) {
std::cout << *it << " - 길이: " << it->length() << "\n";
}
// 범위 기반 for 루프 (C++11 이상)
for (const auto& word : words) {
std::cout << word << "\n";
}
역방향 순회
for (auto rev_it = words.rbegin(); rev_it != words.rend(); ++rev_it) {
std::cout << *rev_it << " ";
}
임의 위치에 요소 삽입
insert 멤버 함수는 지정한 위치에 요소를 삽입하며, 기존 요소들을 뒤로 밀어냅니다.
#include <iostream>
#include <vector>
#include <array>
int main() {
std::vector<int> items {100, 200};
// 단일 요소 삽입
items.insert(items.begin() + 1, 150); // {100, 150, 200}
// 다중 동일 값 삽입
items.insert(items.end(), 2, 999); // 끝에 999를 2개 추가
// 다른 컨테이너의 범위 삽입
std::array<int, 3> extra {7, 8, 9};
items.insert(items.end(), extra.begin(), extra.end());
// 초기화 리스트 삽입
items.insert(items.begin(), {0, 50});
for (const auto& val : items) {
std::cout << val << " ";
}
return 0;
}
요소 제거 방법
끝 요소 제거
pop_back은 마지막 요소를 제거하며, size만 감소시키고 capacity는 변경하지 않습니다.
std::vector<int> nums {10, 20, 30, 40, 50};
nums.pop_back(); // 50 제거, size=4, capacity=5
특정 위치 요소 제거
erase는 단일 요소 또는 범위를 제거하며, 제거된 요소 다음 위치의 반복자를 반환합니다.
#include <vector>
#include <iostream>
int main() {
std::vector<int> nums {10, 20, 30, 40, 50};
// 특정 위치 단일 요소 제거
auto next = nums.erase(nums.begin() + 2); // 30 제거
std::cout << "제거 후: ";
for (auto n : nums) std::std::cout << n << " ";
std::cout << "\n다음 요소: " << *next << "\n"; // 40
// 범위 제거: [first, last) 구간
nums.erase(nums.begin(), nums.begin() + 2); // 처음 두 요소 제거
return 0;
}
erase 호출 후 반환된 반복자를 활용하면 안전하게 후속 작업을 이어갈 수 있습니다. 범위 제거 시에는 [begin, end) 반개구간 형태로 지정하며, 제거된 구간 뒤의 첫 번째 요소를 가리키는 반복자가 반환됩니다.