C++ vector는 요소가 추가되거나 제거될 때 자동으로 크기가 조정되는 동적 배열입니다. 요소들은 연속적으로 저장되어 빠른 인덱스 접근과 반복자를 통한 순회가 가능합니다.
삽입은 상각 상수 시간에 끝에서 발생합니다. 마지막 요소 제거도 상수 시간이지만, 처음이나 중간에서 삽입/삭제하려면 요소 이동이 필요해 선형 시간 복잡도가 듭니다.
언제 vector를 사용하는가?
시간에 따라 변경되는 요소들에 대한 크기 조절 가능한 컨테이너가 필요할 때
컬렉션의 최종 크기가 컴파일 타임에 알려지지 않았을 때
C++에서 vector 초기화 방법
std::vector<data-type> name (size, value); // size와 value는 선택 사항
data-type은 요소 타입 지정
name은 vector 식별자
선택적 size 매개변수는 공간 예약; value는 모든 요소를 초기화
반복자(Iterators)
반복자들은 vector 요소들에 대한 포인터 같은 인터페이스를 제공합니다. 일반적인 반복자 함수들:
begin() – 첫 번째 요소
end() – 끝 다음 요소
cbegin() – 첫 번째 요소로의 읽기 전용 반복자
cend() – 마지막 요소 다음의 읽기 전용 반복자
수정자(Modifiers)
수정자들은 vector의 내용을 변경합니다. 주요 함수들:
push_back() – 요소 추가
insert() – 지정된 위치에 삽입
pop_back() – 마지막 요소 제거
erase() – 요소 범위 삭제
clear() – 모든 요소 제거
예제 1: 기본 순회
#include <iostream>
#include <vector>
int main() {
std::vector<int> nums;
for (int a = 1; a <= 5; ++a) {
nums.push_back(a);
}
std::cout << "Output from begin and end: ";
for (auto it = nums.begin(); it != nums.end(); ++it) {
std::cout << *it << ' ';
}
std::cout << "\nOutput from cbegin and cend: ";
for (auto it = nums.cbegin(); it != nums.cend(); ++it) {
std::cout << *it << ' ';
}
return 0;
}
출력:
예제 2: 고급 수정자
#include <iostream>
#include <vector>
int main() {
std::vector<int> nums;
nums.assign(5, 1); // 5개 요소, 모두 1로 초기화
std::cout << "Vector contents: ";
for (size_t i = 0; i < nums.size(); ++i) {
std::cout << nums[i] << ' ';
}
nums.push_back(2);
std::cout << "\nLast element: " << nums.back();
nums.pop_back();
std::cout << "\nVector contents: ";
for (int a : nums) std::cout << a << ' ';
nums.insert(nums.begin(), 7);
std::cout << "\nFirst element: " << nums.front();
nums.clear();
std::cout << "\nSize after clear(): " << nums.size();
return 0;
}
출력:
용량 함수(Capacity Functions)
다음 함수들로 vector의 저장 특성을 확인하고 조작하세요:
size() – 현재 요소 수
max_size() – 이론적 최대 요소 수
capacity() – 할당된 저장 용량
resize(n) – 요소 수를 n으로 변경, 필요에 따라 추가/제거
empty() – vector가 비어 있으면 true
예제 3: 용량 탐색
#include <iostream>
#include <vector>
int main() {
std::vector<int> vector1;
for (int x = 1; x <= 10; ++x) {
vector1.push_back(x);
}
std::cout << "Vector size: " << vector1.size() << std::endl;
std::cout << "Vector capacity: " << vector1.capacity() << std::endl;
std::cout << "Maximum size of vector: " << vector1.max_size() << std::endl;
vector1.resize(5);
std::cout << "Vector size after resizing: " << vector1.size() << std::endl;
if (!vector1.empty())
std::cout << "Vector is not empty" << std::endl;
else
std::cout << "Vector is empty" << std::endl;
return 0;
}