Vector에 대해서
C++의 std::vector는 동적 배열(dynamic array)을 나타내는 표준 템플릿 라이브러리(STL) 컨테이너 중 하나입니다. std::vector는 크기가 동적으로 조절되며, 배열의 특성과 함께 제공되는 다양한 멤버 함수를 사용하여 요소에 효율적으로 접근할 수 있습니다.
std::vector의 주요 특징과 사용법은 다음과 같습니다:
1. 특징:
- 동적 크기 조절: 배열의 크기는 동적으로 조절되며, push_back, pop_back 등의 함수를 사용하여 쉽게 조작할 수 있습니다.
- 임의 접근: 배열의 각 요소에 대해 인덱스를 사용하여 빠르게 접근할 수 있습니다.
- 연속적인 메모리 할당: std::vector는 내부적으로 연속적인 메모리 블록에 요소들을 저장하므로, 배열의 특성을 가지고 있습니다.
- 효율적인 동적 할당: 필요에 따라 크기를 동적으로 조절하며, 효율적인 메모리 관리를 지원합니다.
2. 사용법:
//헤더 파일 포함 :
#include <vector>
//선언 및 초기화 :
std::vector<int> myVector; // 빈 vector 선언
std::vector<int> myVector = {1, 2, 3}; // 초기값을 갖는 vector 선언
//요수 추가 및 삭제 :
myVector.push_back(4); // 끝에 요소 추가
myVector.pop_back(); // 끝에 있는 요소 삭제
// 삭제에 대해서는 뒤에 한번 더 설명드리겠습니다.
//크기 및 용량 확인 :
size_t size = myVector.size(); // 요소의 개수
size_t capacity = myVector.capacity(); // 현재 할당된 용량
//임의 접근 :
int value = myVector[2]; // 인덱스 2에 있는 요소에 접근
//범위 기반 for 루프 사용 :
for (const auto& element : myVector) {
// element를 사용하여 작업
}
std::vector는 다양한 상황에서 사용되며, 크기의 동적 조절이 필요하거나 배열의 특성을 유지하면서 요소에 효율적으로 접근해야 하는 경우에 특히 유용합니다.
Vector의 삭제 방법
std::vector에서 요소를 삭제하는 방법은 여러 가지가 있습니다. 주로 erase 및 pop_back 함수가 사용되며, 특정 위치의 요소 또는 일치하는 값의 요소를 삭제할 수 있습니다.
1. erase 함수 사용:
erase 함수를 사용하여 특정 위치의 요소나 일치하는 값의 요소를 삭제할 수 있습니다.
a. 특정 위치의 요소 삭제:
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVector = {1, 2, 3, 4, 5};
// iterator를 사용하여 특정 위치의 요소 삭제
std::vector<int>::iterator it = myVector.begin() + 2; // 2번째 요소 (인덱스 2)
myVector.erase(it);
// 또는 인덱스를 직접 사용
// myVector.erase(myVector.begin() + 2);
for (const auto& element : myVector) {
std::cout << element << " ";
}
return 0;
}
b. 특정 값과 일치하는 요소 삭제:
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVector = {1, 2, 3, 4, 3, 5};
// 특정 값과 일치하는 모든 요소 삭제
int valueToRemove = 3;
myVector.erase(std::remove(myVector.begin(), myVector.end(), valueToRemove), myVector.end());
for (const auto& element : myVector) {
std::cout << element << " ";
}
return 0;
}
2. pop_back 함수 사용:
pop_back 함수는 벡터의 끝에서 요소를 제거합니다.
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVector = {1, 2, 3, 4, 5};
// 끝에서 요소 제거
myVector.pop_back();
for (const auto& element : myVector) {
std::cout << element << " ";
}
return 0;
}
주의사항:
- erase 함수는 특정 위치나 값과 일치하는 요소를 삭제할 때 사용됩니다.
- erase 함수를 사용할 때 주의할 점은 범위 기반 삭제 시에는 올바른 iterator 범위를 지정해야 합니다.
- pop_back 함수는 항상 끝에서 요소를 제거하므로 특정 위치의 요소를 삭제하려면 erase를 사용해야 합니다.
Vector의 장점과 단점
std::vector는 많은 장점을 가지고 있지만, 몇 가지 제약과 단점도 고려해야 합니다.
장점:
- 동적 크기 조절: std::vector는 동적으로 크기를 조절할 수 있습니다. 요소를 추가하거나 삭제하여 크기를 동적으로 변경할 수 있습니다.
- 임의 접근: 배열처럼 인덱스를 사용하여 요소에 직접 접근할 수 있습니다. 이는 빠른 접근을 가능하게 합니다.
- 연속적인 메모리 할당: std::vector는 요소들을 연속적인 메모리에 저장합니다. 이는 캐시 효율성과 메모리 참조의 효율성을 증가시킵니다.
- 효율적인 동적 할당: 요소가 추가될 때마다 내부적으로 필요한 만큼의 메모리를 동적으로 할당하며, 필요 없어지면 해제합니다.
- STL 알고리즘과 통합: std::vector는 STL 알고리즘과 호환되어 여러 유용한 알고리즘을 사용할 수 있습니다.
- 범위 기반 for 루프 지원: C++11 이상에서는 범위 기반 for 루프를 사용하여 std::vector를 쉽게 순회할 수 있습니다.
단점:
- 중간 삽입/삭제의 비효율성: 중간에 요소를 삽입하거나 삭제할 때 비효율적입니다. 중간에 요소를 추가하면 해당 위치 이후의 모든 요소를 이동시켜야 합니다.
- 메모리 낭비: std::vector는 일반적으로 현재 사용 중인 요소보다 더 많은 메모리를 할당합니다. 따라서 capacity가 실제 요소의 수보다 크고 낭비될 수 있습니다.
- 객체 소멸에 따른 오버헤드: 객체가 벡터에서 제거될 때, 해당 객체의 소멸자가 호출되므로, 많은 객체를 갖는 벡터를 사용하는 경우 소멸자 호출에 따른 오버헤드가 발생할 수 있습니다.
- Reallocation Overhead: 요소를 추가할 때, capacity를 초과하는 경우 새로운 메모리를 할당하고 기존 요소를 복사해야 합니다. 이는 성능 저하를 일으킬 수 있습니다.
std::vector는 일반적으로 많은 상황에서 좋은 선택이지만, 특정한 요구 사항에 따라 다른 컨테이너가 더 적합할 수 있습니다. 예를 들어, 중간에 요소를 삽입/삭제해야 하는 경우라면 std::list를 고려할 수 있습니다.
'IT, 컴퓨터' 카테고리의 다른 글
[C++] 자료구조 std::list의 특징 및 사용법에 대해서 (104) | 2024.01.17 |
---|---|
[C++] 자료구조 std::deque의 특징 및 사용법에 대해서 (83) | 2024.01.16 |
[C++] 자료구조 Iterator의 원리와 사용법 (97) | 2024.01.13 |
안드로이드 OS의 탄생과 발전 그리고 특징 (91) | 2024.01.12 |
애플 Mac의 탄생과 활용 분야 그리고 장단점 (90) | 2024.01.08 |