2. 1. Vector를 생성하거나 복사할 때 미리 크기를 지정한다.
• Vector의 memory가 다 차면 더 크게 재할
당을 받는다.
• 메모리 재 할당
1. vector_old보다 큰 새로운 vector_new
memory 할당
2. Vector_old의 내용을 vector_new에 복사
3. Vector_old의 내용 삭제
4. Vector_old의 메모리 할당 해제
3. 1. Vector를 생성하거나 복사할 때 미리 크기를 지정한다.
• 만약 그냥 vector를 생성해서 값을 하나하
나 넣어준다면?
• 새롭게 값을 넣어주다가 계속해서 메모리
재 할당이 발생
• 크기를 아는 경우 한번에 크게 할당 해 놓
으면 메모리 재 할당이 일어나지 않는다.
5. 2. vector.shrink_to_fit()
• Vector.shrink_to_fit()을 지원하지 않을 때
• Vector<T>().swap(vector_cur)
– 텅 빈 벡터와 현재 벡터를 교환해준다.
– 벡터의 모든 값을 삭제하고 메모리도 초기화
• Vector<T>(vector_cur).swap(vector_cur)
– 자기 자신을 넣은 복사 생성자와 교환해준다.
– 현재 size만큼만 메모리가 남게 된다.
6. 3. 대입연산자 vs insert vs
push_back
• 대입연산자
– 기존 벡터의 크기를 알고 있다.
– 새로운 벡터의 크기 재 할당은 한번만.
– vector가 아닌 다른 컨테이너에서 복사하는
경우에는 대입연산자는 사용할 수 없다.
• 이 때는 insert를 사용하자.
7. 3. 대입연산자 vs insert vs
push_back
• Vector.Insert(p,b,e)
– Vector의 p 위치에 반복자 b부터 e까지의 값
을 넣어준다.
– 이 경우도 반복자의 시작과 끝을 알고 있기 때
문에 재 할당이 반복해서 일어나지 않는다.
8. 3. 대입연산자 vs insert vs
push_back
• Push_back()
– 공간이 부족해질 때마다 재 할당이 발생
– 비효율적
– 복사 할 크기를 알고 있다면 미리 메모리 할
당부터 하고 값을 복사 해 오면 좀 나아지지
않을까…
9. 4. 반복자 vs vector.at() vs vector[i]
• 이 경우 at()이 속도가 가장 느리다.
• 왜?
• at(p) 함수의 경우 p의 값을 vector.size()
와 비교해서 적절한 위치에 접근하는지를
판단한 이후 값을 반환해준다.
• 따라서 안정성은 높다.
10. 4. 반복자 vs vector.at() vs vector[i]
• Vector[i] 의 경우 속도는 빠르지만 잘못된
위치에 접근할 수 있기 때문에 치명적인
오류를 발생시킬 수 있다.
11. 5. Vector.insert(p,x)
– vector의 p 위치에 x 값을 입력한다.
– p위치 이후로 있는 원소들이 모두 한 칸씩 뒤
로 밀려야 한다. -> 매우 비효율적
– 만약 반복적으로 insert(p,x) 를 사용해야 하는
경우가 생긴다면?
• 구조를 다시 짜보자..
12. 6. push_back() vs emplace_back()
• Vector<T> vector_test;
• Vector_test.push_back( T );
• Vector_test.emplace_back( T생성 인자)
13. 6. push_back() vs emplace_back()
• Push_back()
– 객체를 전달한다.
– 전달받은 객체를 vector의 맨 뒤에 넣어준다.
– 새로운 값을 입력하는 경우에는 임시 객체의
생성과 이동생성자의 호출, 임시 객체의 파괴
가 일어난다.
14. 6. push_back() vs emplace_back()
• Emplace_back
– 객체생성을 위한 인자를 전달한다.
– 전달받은 인자로 생성한 객체를 vector의 맨
뒤에 넣어준다.
– 전달받은 인자로 생성한 객체가 vector에 바
로 저장되기 때문에 임시 객체가 생성되지 않
는다.