vector
- std::vector는 표준 라이브러리에서 제공하는 동적 배열 컨테이너
- 배열과 유사한 인터페이스를 제공하지만 크기를 동적으로 조정할 수 있음
동적 크기 조정
- 배열괄 달리 원소 개수를 동적으로 조정할 수 있다.
- 원소를 추가하거나 제거할 때 자동으로 크기가 조정된다
순차적 저장
- 원소들을 메모상에 연속적으로 저장하므로 인덱스를 빠르게 접근 할 수 있다.
원소 추가 및 제거:
push_back(value)
: 배열의 끝에 원소를 추가합니다.pop_back()
: 배열의 끝에 있는 원소를 제거합니다.insert(position, value)
: 특정 위치에 원소를 삽입합니다.erase(position)
: 특정 위치의 원소를 제거합니다.
크기 및 용량 관련 함수:
size()
: 현재 원소 개수를 반환합니다.capacity()
: 현재 할당된 메모리 공간 크기를 반환합니다.resize(new_size)
: 원소 개수를 변경하고, 더 많은 원소를 추가하거나 제거할 수 있습니다.
인덱스 접근 및 순회:
at(index)
: 지정한 인덱스에 해당하는 원소에 접근하며, 범위를 벗어나면 예외가 발생합니다.operator[](index)
: 지정한 인덱스에 해당하는 원소에 접근하며, 범위를 벗어나도 예외가 발생하지 않습니다.begin()
와end()
: 반복자(iterator)를 반환하여 벡터를 순회할 수 있습니다.
메모리 관리:
shrink_to_fit()
: 현재 원소 개수에 맞게 메모리 공간 크기를 조정합니다.
복사와 할당:
std::vector
의 복사 생성자와 대입 연산자를 사용하여 벡터를 복사하거나 대입할 수 있습니다.Copy code #include <iostream> #include <vector> int main() { std::vector<int> numbers; // 빈 벡터 생성 numbers.push_back(10); numbers.push_back(20); numbers.push_back(30); for (const int& num : numbers) { std::cout << num << " "; } return 0; }
백터가 항상 효율적이냐?
백터(
std::vector
또는ArrayList
)를 사용하는 것이 항상 효율적인 것은 아닙니다. 효율성은 사용되는 상황과 요구 사항에 따라 달라집니다. 아래의 몇 가지 상황을 고려해보겠습니다.백터 사용이 효율적인 상황:*
- 동적 크기 조정이 필요한 경우: 만약 원소의 개수가 동적으로 변하거나, 크기를 미리 예측하기 어려운 경우에는 백터가 유용합니다. 크기가 자주 변경되는 컨테이너에서 편리하게 사용할 수 있습니다.
- 순차적인 데이터 접근: 원소들을 순차적으로 접근하는 작업에서는 백터의 연속적인 메모리 배치가 성능 향상에 도움이 될 수 있습니다.
다른 자료 구조 또는 상황의 효율성:
고정 크기 배열: 만약 원소의 개수가 고정되어 있고 크기 변경이 필요하지 않다면, 고정 크기 배열을 고려해 볼 수 있습니다. 크기 변경의 필요성이 없는 경우 메모리 사용 면에서 더 효율적일 수 있습니다.
특정 접근 패턴: 빈번한 중간 원소의 삽입 및 삭제가 필요한 경우라면 연결 리스트나 트리와 같은 다른 자료 구조를 고려할 수 있습니다. 이러한 자료 구조는 삽입 및 삭제 작업에 효율적일 수 있습니다.
메모리 사용 고려: 백터는 메모리 할당 및 해제 작업을 내부적으로 수행하므로, 메모리 사용에 대한 고려가 필요합니다. 큰 데이터셋의 경우에는 메모리 효율성을 고려하여 다른 자료 구조를 선택하기도 합니다.
데이터 정렬 및 탐색: 정렬된 데이터를 다루거나 특정 원소의 탐색이 빈번한 경우에는 트리 기반의 자료 구조가 효율적일 수 있습니다.
즉, 백터는 동적 크기 조정 및 순차적인 데이터 접근에 유용한 자료 구조입니다. 하지만 각 상황마다 어떤 자료 구조가 가장 효율적인지 판단하기 위해서는 사용하고자 하는 작업의 특성을 고려하고 비교해보는 것이 중요합니다.