std::vector는 C++에서 가장 자주 사용되는 동적 배열 컨테이너로, 크기가 가변적이며, 메모리를 자동으로 관리해주는 장점을 가지고 있습니다.
주요 특징
1. 동적 크기 조정
std::vector는 내부적으로 배열을 사용하지만, 배열과 달리 크기가 고정되지 않습니다. 요소를 추가하거나 삭제할 때 자동으로 메모리를 재할당하여 크기를 조정합니다. 이 덕분에 미리 크기를 설정할 필요가 없고, 필요에 따라 메모리가 동적으로 할당됩니다.
2. 연속된 메모리 블록
벡터는 내부적으로 연속된 메모리 블록을 사용합니다. 즉, 요소들이 메모리 상에 순차적으로 저장되므로 인덱스를 통한 빠른 접근이 가능합니다. 배열과 마찬가지로 인덱스 연산의 시간 복잡도는 O(1) 입니다.
3. 다양한 연산 지원
std::vector는 다양한 기본 연산을 제공합니다.
- 추가: push_back()을 통해 요소를 끝에 추가할 수 있습니다.
- 삭제: pop_back(), erase()로 요소를 제거할 수 있습니다.
- 접근: operator[], at()를 사용하여 특정 위치의 요소에 접근할 수 있습니다.
또한, C++ STL(표준 템플릿 라이브러리) 알고리즘과 연동하여 정렬, 검색 등 다양한 작업을 수행할 수 있습니다.
[C++] STL(표준 템플릿 라이브러리) 알고리즘이란?
[C++] STL(표준 템플릿 라이브러리) 알고리즘이란?
STL(표준 템플릿 라이브러리)은 C++에서 제공하는 강력한 라이브러리로, 다양한 자료구조와 알고리즘을 제공합니다. STL 알고리즘은 컨테이너와 함께 사용되며, 일반적으로 다음과 같은 주요 범주
jeagyoo2.tistory.com
[C++] STL알고리즘과 vector와의 연동
STL에서 vector는 동적 배열을 제공하는 컨테이너입니다. STL 알고리즘은 이러한 컨테이너와 함께 사용되어 효율적으로 데이터를 처리할 수 있게 해줍니다. vector와 알고리즘의 연동-데이터 저장: v
jeagyoo2.tistory.com
4. 메모리 관리
벡터는 생성과 동시에 메모리를 할당하고, 파괴될 때 자동으로 메모리를 해제합니다. 따라서 std::vector를 사용하면 메모리 누수에 대한 걱정을 덜 수 있습니다. 메모리 관리를 C++가 자동으로 처리해주기 때문에 프로그래머는 더욱 쉽게 코드를 작성할 수 있습니다.
5. 범위 기반 for 루프 지원
C++11부터는 범위 기반 for 루프를 통해 벡터의 요소를 간결하게 순회할 수 있습니다. 이를 통해 코드의 가독성을 크게 높일 수 있습니다.
std::vector<int> vec = {1, 2, 3};
for (int value : vec) {
std::cout << value << " ";
}
성능 관련 고려 사항
1. 메모리 재할당과 성능
벡터는 크기가 부족할 때 새로운 메모리 블록을 할당하고, 기존 요소를 복사하여 새로운 블록으로 옮기는 과정을 거칩니다. 이 과정은 비용이 크기 때문에 성능에 영향을 줄 수 있습니다. 따라서 대량의 요소가 추가될 것으로 예상된다면 reserve() 함수를 사용하여 미리 메모리를 할당해 성능을 최적화할 수 있습니다.
std::vector<int> vec;
vec.reserve(100); // 100개의 요소를 추가할 공간을 미리 확보
2. Capacity와 Size
벡터의 size는 현재 벡터에 들어있는 요소의 개수를 나타내고, capacity는 벡터가 할당받은 총 메모리 크기를 나타냅니다.
벡터는 요소가 추가될 때마다 메모리를 재할당하여 크기를 키우기 때문에, capacity()와 size()가 다를 수 있습니다. reserve()를 통해 capacity를 미리 할당하면, 중간에 불필요한 메모리 재할당을 피할 수 있습니다.
std::vector<int> vec;
std::cout << "Size: " << vec.size() << std::endl;
std::cout << "Capacity: " << vec.capacity() << std::endl;
3. 복사와 이동
C++11부터 std::vector는 이동 연산자를 지원합니다. 기존에 있던 벡터의 데이터를 새 벡터로 '이동'시키는 방식으로, 복사에 드는 성능 비용을 줄일 수 있습니다. 이동은 기존 데이터를 새로운 메모리로 복사하지 않고 포인터만 옮기기 때문에 효율적입니다.
std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2 = std::move(vec1); // vec1의 데이터를 vec2로 이동
4. 안정성 및 예외 처리
벡터는 예외 안전성을 보장합니다. 예를 들어, 벡터가 확장될 때 메모리 할당이 실패하면, 기존에 할당된 메모리는 자동으로 해제됩니다. 또한 예외가 발생하면 복사된 객체는 소멸되므로 데이터 무결성이 유지됩니다.
std::vector 함수 개념
- push_back(value) : 벡터의 맨 뒤에 요소를 추가합니다.
- pop_back() : 벡터의 마지막 요소를 제거합니다.
- erase(iterator) : 지정된 위치의 요소를 제거합니다.
- clear() : 모든 요소를 제거합니다.
- resize(n) : 벡터의 크기를 n으로 조정합니다.
- reserve(n) : 벡터의 용량을 최소 n으로 확보합니다.
- at(index) : 안전하게 해당 인덱스의 요소에 접근합니다(범위를 벗어나면 예외 발생).
- size() : 벡터에 저장된 요소의 개수를 반환합니다.
- capacity() : 벡터가 현재 할당받은 메모리 용량을 반환합니다.
코드 예시
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec;
// 요소 추가
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
// 요소 출력
for (int value : vec) {
std::cout << value << " ";
}
// 특정 요소 접근
std::cout << "\n첫 번째 요소: " << vec[0] << std::endl;
// 벡터의 크기와 용량 확인
std::cout << "Size: " << vec.size() << std::endl;
std::cout << "Capacity: " << vec.capacity() << std::endl;
return 0;
}
'C++' 카테고리의 다른 글
[C++] push_back 함수 (1) | 2024.10.14 |
---|---|
[C++] fmodf함수 (1) | 2024.10.13 |
[C++] STL알고리즘과 vector와의 연동 (2) | 2024.10.10 |
[C++] STL(표준 템플릿 라이브러리) 알고리즘이란? (2) | 2024.10.09 |
[C++] 출력 스트림 객체 std::cout (1) | 2024.09.26 |