본문 바로가기
IT, 컴퓨터

[C++] 자료구조 Vector의 원리와 특징에 대해서

by 별찌파파 2024. 1. 14.
728x90
반응형
SMALL

Photo by Markus Spiske on Unsplash

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에서 요소를 삭제하는 방법은 여러 가지가 있습니다. 주로 erasepop_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는 많은 장점을 가지고 있지만, 몇 가지 제약과 단점도 고려해야 합니다.

 

장점:

  1. 동적 크기 조절: std::vector는 동적으로 크기를 조절할 수 있습니다. 요소를 추가하거나 삭제하여 크기를 동적으로 변경할 수 있습니다.
  2. 임의 접근: 배열처럼 인덱스를 사용하여 요소에 직접 접근할 수 있습니다. 이는 빠른 접근을 가능하게 합니다.
  3. 연속적인 메모리 할당: std::vector는 요소들을 연속적인 메모리에 저장합니다. 이는 캐시 효율성과 메모리 참조의 효율성을 증가시킵니다.
  4. 효율적인 동적 할당: 요소가 추가될 때마다 내부적으로 필요한 만큼의 메모리를 동적으로 할당하며, 필요 없어지면 해제합니다.
  5. STL 알고리즘과 통합: std::vector는 STL 알고리즘과 호환되어 여러 유용한 알고리즘을 사용할 수 있습니다.
  6. 범위 기반 for 루프 지원: C++11 이상에서는 범위 기반 for 루프를 사용하여 std::vector를 쉽게 순회할 수 있습니다.

단점:

  1. 중간 삽입/삭제의 비효율성: 중간에 요소를 삽입하거나 삭제할 때 비효율적입니다. 중간에 요소를 추가하면 해당 위치 이후의 모든 요소를 이동시켜야 합니다.
  2. 메모리 낭비: std::vector는 일반적으로 현재 사용 중인 요소보다 더 많은 메모리를 할당합니다. 따라서 capacity가 실제 요소의 수보다 크고 낭비될 수 있습니다.
  3. 객체 소멸에 따른 오버헤드: 객체가 벡터에서 제거될 때, 해당 객체의 소멸자가 호출되므로, 많은 객체를 갖는 벡터를 사용하는 경우 소멸자 호출에 따른 오버헤드가 발생할 수 있습니다.
  4. Reallocation Overhead: 요소를 추가할 때, capacity를 초과하는 경우 새로운 메모리를 할당하고 기존 요소를 복사해야 합니다. 이는 성능 저하를 일으킬 수 있습니다.

std::vector는 일반적으로 많은 상황에서 좋은 선택이지만, 특정한 요구 사항에 따라 다른 컨테이너가 더 적합할 수 있습니다. 예를 들어, 중간에 요소를 삽입/삭제해야 하는 경우라면 std::list를 고려할 수 있습니다.

728x90
반응형
LIST