C++ STL vector

chanykim·2021년 12월 15일
0

c++ 98기준으로 stl vector를 구현하는 과제입니다.
여러 함수들 중에서도 헷갈리는 함수들을 정리해보았습니다.

resize

void resize (size_type n, value_type val = value_type());
std::vector<int> v(10);
for(std::vector<int>::size_type i = 0; i < v.size() ; i++)
	v[i] = 1 + i; // 1 ~ 10까지 push
v.resize(5); // print: 1 2 3 4 5, size: 5, capacity: 10
v.resize(7); // print: 1 2 3 4 5 0 0, size: 7, capacity: 10
v.resize(13); // print: 1 2 3 4 5 0 0 0 0 0 0 0 0, size: 13, capacity: 13
v.resize(15, 11); // print: 1 2 3 4 5 0 0 0 0 0 0 0 0 11 11, size: 15, capacity: 26

resize는 벡터의 사이즈를 새로 정의하는 것으로 capacity는 건드리지 않습니다.
v.resize(15, 11)는 기존 size가 n보다 적다면 n만큼 size를 키우고 그 자리에 0이 아닌 11로 채웁니다.

만약에 아래와 같이 벡터가 형성 되었을 때 size는 4 capacity는 7일 것입니다.

하지만 push_back을 활용하여

이렇게 들어왔다고 하고 남은 capacity가 없으니 다음에 들어올 때에 컴파일러마다 다르겠지만 (이전 capacity + (이전 capacity / 2))으로 재할당하겠다고 생각한다면

이렇게 들어오게 될텐데 그렇다면 capacity를 늘리고 기존 정보를 복사하고 기존에 있던 것은 제거를 해야합니다.
resize를 구현할 때 미리메모리를 할당할 수있는 reserve함수를 필요로 합니다.

reserve

void reserve (size_type n);

n이 기존 capacity보다 크면 메모리 재할당과 원소복사를 한 새로운 array를 만듭니다.
하지만 n이 기존 capacity보다 작다면 아무런 일이 일어나지 않습니다.
재할당 하는 것은 std::allocator를 이용하는데 이 때 참고했던 블로그인 https://woo-dev.tistory.com/51 이곳에서 살펴봐도 좋습니다.
reserve를 만들 때 allocate를 이용하여 초기화되지 않은 메모리 공간을 할당하여 그 시작 주소를 반환합니다.
그리고 기존에 있던 정보를 construct 함수를 써서 초기화되지 않은 공간에 기존 요소를 저장합니다.
그리고 destroy 함수로 기존 객체를 소멸시키고 마지막으로 deallocate 함수로 기존에 있던 메모리 공간을 해제합니다.

만약에 capacity가 0인 vector로 만들었을 때

std::vector<int> v;
v.reserve(14);
for(std::vector<int>::size_type i = 0;i < v.capacity() ;i++)
  v[i] = 1 + i;

capacity는 14이지만 size는 0으로 size에 변화가 있지는 않습니다.
그래서 백터에 요소를 저장할 때 push_back함수를 사용합니다.

std::vector<int> v;
v.reserve(14);
for(std::vector<int>::size_type i = 0;i < v.capacity() ;i++)
  v.push_back(1 + i);

capacity: 14, size: 14로 원소가 채워질 때마다 size가 늘어납니다.

insert

iterator insert (iterator position, const value_type& val);
	
void insert (iterator position, size_type n, const value_type& val);
	
template <class InputIterator>
    void insert (iterator position, InputIterator first, InputIterator last);

원소를 추가하는 함수입니다.
특정 위치에 원소를 추가함으로써 벡터의 size가 현재 벡터의 capacity보다 크면 재할당합니다.

벡터는 배열의 형태로 저장되기 때문에 벡터 끝이 아닌 임의의 위치에 원소를 삽입하게 되면 그 뒤에 있는 원소들을 뒤로 밀리게 됩니다.

assign

template <class InputIterator>
  void assign (InputIterator first, InputIterator last);	
void assign (size_type n, const value_type& val);

벡터에 새로운 원소를 집어 넣습니다.
벡터 객체에 이전에 있었던 원소들은 모두 삭제하고, 인자로 받은 새로운 내용을 집어 넣습니다.
val이란 원소를 n만큼 재할당된 벡터에 넣습니다.

erase

iterator erase (iterator position);
iterator erase (iterator first, iterator last);

파라미터를 하나 받는 경우에는 벡터의 iter 위치의 인자를 삭제합니다.
파라미터를 두개 받는 경우에는 [start, end) 의 범위의 인자를 삭제 합니다.

예로 0~9까지 원소가 들어있다고 하고,
v.erase(v.begin() + 1, v.begin() + 4);
라고 하면 0,4,5,6,7,8,9 만 남을 것입니다.

profile
오늘보다 더 나은 내일

0개의 댓글