프로그래밍 공부
카테고리
작성일
2023. 10. 17. 15:07
작성자
WDmil
728x90

Vector는, STL( Standard Template Library ) 에 포함된 동적 배열 데이터 구조이다.

 

vector는 배열과 유사하지만, 크기를 동적으로 조절할 수 있는 컨테이너이다.

일반적으로 동적 배열을 구현할때 사용하며, 임의접근이 필요할때 유용하다.

 

예를들어. 리스트나 큐와같이 순차적인 데이터에 비해 특정원소에 빠른 접근이 필요할 경우에 사용된다.

 

#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVector; // 정수형 원소를 담는 vector 생성

    // 원소 추가
    myVector.push_back(10);
    myVector.push_back(20);
    myVector.push_back(30);

    // 원소 출력
    for (int i = 0; i < myVector.size(); i++) {
        std::cout << myVector[i] << " ";
    }

    return 0;
}

 

vector의 장점

  • 동적 크기조절
    • vector는 원소를 동적으로 추가하거나 제거할 수 있으며, 크기가 자동으로 조절된다.
  • 빠른 임의 접근
    • 배열과같이 임의접근이 빠르다. 원소를 인덱스를 사용하여 직접엑세스가 가능하다.
  • STL과의 통합성
    • C++의 표준 라이브러리의 일부임으로 다른 STL컨테이너 및 알고리즘과 호환성이 뛰어나다.

단점

  • 삽입 삭제의 불편함
    • 중간원소를 추가하거나 제거할 때 성능이 저하될 수 있다. list에 비해 느리다.
  • 메모리 재할당
    • 원소를 추가할때 할당된 메모리가 부족할경우. 재할당이 필요할 수 있으며 이때 매우 느려진다.
  • 고정 크기가 아님
    • vector의 크기는 동적으로 조절할 수 있지만. 특정크기로 고정할 수는 없다.

사용상 메모리의 재할당이 발생하면 매우 느리게 다시 재할당이 들어갈 수 있다.

 

이는 vector가 동적배열이기에 발생하는 경우인데.

 

일반적으로 vector가 생성되는 경우. OS가 임의적으로 메모리를 할당하여 그 범위 안에서 동작하게 된다.

일반적으로 vector가 선언되면 위와같이 임의의 메모리가 할당된다.

대충 위와같이 vector의 배열이 가득찼을경우. vector는 순차 데이터구조가 유지되어야 하기 때문에. 더는 데이터를 추가할 수 없는 경우가 생긴다.

 

이경우. OS는 데이터의 메모리할당을 위해서 다음과 같이 데이터 위치를 이동시키게 된다.

통째로 들어서 비워버리고. 더 비어있는 데이터공간으로 이동시켜버리기 때문에.

 

vector의 공간을 더 할당하기 위해 많은 연산을 하게된다.

 

그렇기 때문에. 위와같은 이사를 방지하기 위해. 처음에 vector의 위치를 잡을때 부터 그럴일이 없도록 범위를 아예 지정해버리거나. 빈 vector을 만들어버리는 방법이 있다.

 


초기용량 설정(reserve)

vector를 생성할 때 초기용량을 미리 지정하여 재할당 횟수를 가능한 최소로 줄일수 있다.

즉, 지금당장은 데이터가 할당되지는 않았지만. 나중에 할당될 수 있는 최대의 경우의 수를 미리 지정하여.

현 vector외에도 그 이후의 여유공간을 확보해놓는것이다.

std::vector<int> myVector;
myVector.reserve(100); // 초기 예상 크기 설정

초기용량 설정(resize)

vector를 생성할 때 초기용량을 지정하는게 아니라. 아예 빈 공간에 vector를 채워놓는것을 이야기한다.

지금당장 필요하지는 않지만 생성을 미리 전부 해놓음으로써 사용할 수 있게 정의하는것이다.

std::vector<int> myVector;
myVector.resize(100); // 원소를 추가하기 전에 용량을 설정

복사 오버헤드 줄이기(emplace_back)

위와 다른 결을 이야기하지만, 오버헤드 자체를 줄여서 메모리 사용량을 줄여버리는 효과가 있다.

일반적인 push_back의 경우. 데이터가 복사대입이지만. emplace_back의 경우 복사대입이 아닌 원본대입이기 때문에

데이터를 생성할 때 한번 덜 생성하는 효과가 있다.

myVector.emplace_back(42); // 복사 대신 생성자 호출

 

728x90

'C++' 카테고리의 다른 글

C++ FunctionPointer(함수포인터)  (0) 2023.11.10