벡터(vector)

hyenam·2022년 4월 20일
0

ft_containers

목록 보기
3/8

거의 cplusplus 페이지 파파고 버전입니다.

vector헤더에는

  • vector 템플릿 클래스
  • vector<bool> 특수화 클래스
  • begin (c++11)
  • end (c++11)
    두가지 클래스와 두가지 함수가 있다.

std::vector

벡터는 크기를 변경할 수 있는 배열을 나타내는 시퀀스 컨테이너입니다.

벡터는 요소를 연속적으로 저장한다. 이로인해 벡터는 배열처럼 효율적으로 요소를 일반 포인터처럼 액세스할 수도 있다. 그러나 배열과 달리 메모리 크기는 컨테이너에 의해 자동으로 처리되어 동적으로 변경될 수 있다.

원래 배열은 새 요소가 들어올때마다 재할당을 하고 값을 복사한다. 하지만 이것은 처리 시간 측면에서 상대적으로 비용이 많이 드는 작업이다. 그래서 벡터는 컨테이너에 요소가 추가될 때마다 재할당을 하지 않는다

백터는 들어올 요소의 개수보다 큰 사이즈의 값으로 동적할당을 하고, 그 메모리가 꽉차게 되면 그제서야 더 큰 크기의 새 배열을 동적할당을 한다. 그리고 원래 들어있던 배열의 요소는 새 배열로 복사한다.

따라서 배열에 비해 벡터는 스토리지를 효율적으로 관리하고 동적으로 확장할 수 있는 기능을 제공하는 대신 더 많은 메모리를 소비한다.

다른 동적 시퀀스 컨테이너(덱, 리스트 및 forward_lists)에 비해 벡터는 요소에 접근하는 것이 매우 효율적이며(배열과 마찬가지로), end에 요소를 추가하거나 제거하는 것이 비교적 효율적이다. end가 아닌 다른 위치에 요소를 삽입하거나 제거하는 작업의 경우, 다른 작업보다 성능이 떨어지며 lists와 forward_lists보다 일관성이 낮은 iterator와 reference가 있다.

컨테이너 속성

  • 시퀀스 - 메모리에 순차적으로 저장되어 있다.
  • 다이나믹 배열 - 요소에 직접 접근이 가능하다. 마지막 요소를 빠르게 추가/삭제 할 수 있다.
  • 할당기 - allocator를 사용하여 스토리지 요구를 동적으로 처리한다.

std::allocator

template < class T, class Alloc = allocator<T> > class vector; // generic template

템플릿 매개변수

  • T - 요소의 자료형.
  • Alloc - 메모리 할당에 사용되는 객체. 기본적으로 가장 단순한 메모리 할당 모델을 정의하고 값에 독립적인 할당자 클래스 템플릿이 사용.

멤버 타입

template < class T, class Alloc = allocator<T> > class vector
{
public:
    typedef T                                        value_type;
    typedef Allocator                                allocator_type;
    typedef typename allocator_type::reference       reference;
    typedef typename allocator_type::const_reference const_reference;
    typedef implementation-defined                   iterator;
    typedef implementation-defined                   const_iterator;
    typedef typename allocator_type::size_type       size_type;
    typedef typename allocator_type::difference_type difference_type;
    typedef typename allocator_type::pointer         pointer;
    typedef typename allocator_type::const_pointer   const_pointer;
    typedef std::reverse_iterator<iterator>          reverse_iterator;
    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
}

멤버 함수

  • 생성자
default (1)	
explicit vector (const allocator_type& alloc = allocator_type());

fill (2)	
explicit vector (size_type n, const value_type& val = value_type(),
                 const allocator_type& alloc = allocator_type());

range (3)	
template <class InputIterator>
  vector (InputIterator first, InputIterator last,
          const allocator_type& alloc = allocator_type());

copy (4)	
vector (const vector& x);

(1) 기본 생성자 - 요소가 없는 빈 컨테이너를 만든다.
(2) fill 생성자 - n개의 요소로 컨테이너를 만든다. 각 요소는 val의 복사본입니다.
(3) 범위 생성자 - [first, last]와 같은 수의 요소로 컨테이너를 구성하고 각 요소는 해당 범위의 해당 요소로부터 동일한 순서로 구성됨.
(4) 복사 생성자 - x에 있는 각 요소의 복사본을 같은 순서로 컨테이너를 구성.


  • 소멸자
  • 연산자=
  • begin - 첫 요소를 가리키는 반복자를 반환한다.
    반복자가 non-const와 const 두개이기 때문에 함수도 두개이다.
    iterator begin();
    const_iterator begin() const;
  • end - 마지막 요소의 뒤 요소를 가리키는 반복자를 반환한다. 어떠한 요소도 가리키지 않기때문에 역참조가 되지않는다. 만약 컨테이너가 비어있다면 begin과 동일한 결과를 반환한다.
    begin과 마찬가지로 const, non-const 두개의 함수가 있다.
  • rbegin, rend - 각각 순서대로 마지막요소와 첫번째 요소를 가리키는 reverse_iterator를 반환한다.
    reverse_iterator도 non-const와 const 두개이기 떄문에 각 함수도 non-const 함수와 const함수 두가지가 있다.

  • size - 요소의 개수를 반환한다. 반환타입은 size_type
  • max-size - 벡터가 가질 수 있는 최대 요소 개수를 반환한다. 반환타입은 size_type
  • resize - n개의 요소를 포함하도록 컨테이너의 크기를 조정한다.
    만약 인자로 들어온 n이 현재 컨테이너의 크기보다 작으면 n으로 크기가 작아지고 그 뒤에 있는 요소들은 제거된다.
    n이 현재 컨테이너의 크기보다 크면 남은 공간은에는 필요한 만큼의 요소를 끝에 삽입한다. 두번째 인자를 지정하면 새 요소가 두번째 인자의 복사본으로 초기화되고, 지정하지 않으면 빈 요소(value-initialized)로 초기화된다.
    n이 컨테이너의 할당된 메모리 사이즈보다 크면 자동으로 재할당된다.
  • capacity - 현재 컨테이너에 할당된 메모리 크기를 반환한다.
    반드시 할당되어 있는 크기와 같진 않다.
    반환타입은 size_type
  • empty - 벡터가 비어있는지 확인하는 함수.
  • reserve - 벡터의 할당된 메모리의 크기를 바꾸는 함수.
    벡터 용량이 적어도 n개의 요소를 포함할 수 있도록 요청함.
    n이 현재 벡터 용량보다 크면 이 함수는 컨테이너가 메모리를 재할당하여 용량을 n(또는 그 이상)으로 늘린다.
    다른 경우엔 용량엔 아무변화도 주지 않는다.
    이 함수는 백터가 가지고 있는 요소들에게는 아무 변화도 주지 않는다. (resize와 반대)

  • 연산자[] - 위치 n에 있는 요소에 대한 레퍼런스를 반환한다.
  • at - 위치 n에 있는 요소에 대한 레퍼런스를 반환한다. at은 operator[]와 다르게 인자가 범위를 벗어나면 자동으로out_of_range예외를 던진다.
  • front - 벡터의 첫 요소의 레퍼런스를 반환한다. begin은 반복자를 리턴하지만 front는 요소를 직접적으로 반환하다. 빈 컨테이너에서 사용하면 정의되지 않은 동작을 한다.
  • back - 벡터의 마지막 요소의 레퍼런스를 반환한다. end는 반복자를 리턴하지만 back은 요소를 직접적으로 반환하다. 빈 컨테이너에서 사용하면 정의되지 않은 동작을 한다.

  • assign - 새로운 내용과 크기로 새롭게 벡터를 할당하는 함수이다.
  • push_back - 벡터 끝에 요소를 집어넣는 함수. 정확히는 현재 벡터의 마지막 원소 뒤에 넣는다.
  • pop_back - 마지막 요소를 삭제하는 함수이다. 요소는 파괴된다.
  • insert - 지정된 위치에 요소를 넣는 함수.
    벡터는 배열을 기본 저장소로 사용하기 때문에 벡터 끝 이외의 위치에 요소를 삽입하면 컨테이너가 위치 뒤에 있던 모든 요소를 새 위치로 재배치한다.
  • erase - 위치 또는 요소 범위([첫 번째, 마지막])를 제거한다. insert와 마찬가지로 벡터는 배열을 사용해서 요소가 지워지면 원래 있던 요소들을 새로 재배치한다.
  • swap - 벡터의 내용을 인자로 받은 다른 벡터와 서로 내용과 바꾸는 함수이다.
  • clear - 모든 요소를 벡터에서 제거하고, 컨테이너의 크기를 0으로 만드는 함수.
    재할당은 보장되지 않으며, 벡터 용량은 이 함수의 호출로 인해 변경되지 않는다. 확실하게 메모리 해제를 하기 위해서는 swap함수르르 사용해야한다. ex)vector<T>().swap(x);

  • get_allocator - 벡터와 연관된 allocator 개체의 복사본을 반환한다. 해당 함수를 사용해 allocator에 직접적으로 접근해 벡터에 값을 추가할 수 있다.

비 멤버함수

  • 연산자 ==, !=, < , <=, >, >=
  • swap(vector) - 템플릿 매개변수가 동일한 두 벡터의 내용을 바꾼다. 벡터의 멤버 함수인 swap과 같은 동작을 한다.

cplusplus

profile
공부한 걸 정리하고 있습니다.

0개의 댓글