1 minute read

💚ref.

  1. cplusplus Reference: std::vector
  2. cppreferencce.com: std::vector
  3. Microsoft Learn: vector 클래스
  4. push_back vs emplace_back


1. vector 클래스


2. 멤버 함수

더 많은 기능은 MS vector Functions 참고

2.1. Iterators

함수명 기능
v.begin() v의 첫 번째 원소에 대한 이터레이터 반환
v.end() v의 마지막 원소 이터레이터 반환

비교 : begin, rbegin, cbegin, crbegin 차이


2.2. Capacity

함수명 기능
v.size() v의 원소 개수 반환
v.max_size() v의 최대 길이 반환
v.resize(size, val) v의 크기를 size로 설정.
size가 원래 크기보다 큰 경우 빈 공간을 val로 채움
v.capacity() v의 저장공간 길이(벡터가 포함할 수 있는 원소의 개수)
v.empty() v가 비어 있는지 유무 확인(bool)
v.reserve(size) v에 할당할 최소 길이
shirink_to_fit v의 빈 공간 삭제


2.3. Elem Access

함수명 기능
v.at(idx) vidx번째 원소 참조
v.back() v의 마지막 원소 참조
v.front() v의 첫 번째 원소 참조
v.data() v의 첫 번째 원소에 대한 포인터 반환


2.4. Modifiers

함수명 기능
v.assign(size, val)
v.assign(fisrt, last)
기존 벡터 원소 제거 후 size만큼의 val원소 할당 혹은
이터레이터 firstlast의 사잇값 모두 할당
v.push_back(val) v 마지막에 원소 추가
v.pop_back() v의 마지막 원소 제거
v.insert(pos, cnt, val) pos 번째 위치부터 cnt만큼 val 삽입
v.erase(pos)
v.erase(first, last)
vpos 번째 원소 혹은 first부터 last까지의 원소 제거
v1.swap(v2) v1v2의 원소 교환
v.clear() v의 원소 제거
v.emplace() push_back 효율 개선


2.4.1. push_back vs emplace_back


함수 정리 도중 궁금해서 찾아본 push_back과 emplace_back 차이!

둘 다 벡터 말단에 객체를 삽입하는 방식은 같다. 두 함수의 어떤 동작에서 차이가 있을까?


먼저 push_back 함수는 외부에서 별도의 객체를 만들어 vector에 삽입한 후 해당 임시 객체를 삭제하는 반면, emplace_back은 함수 내부에 생성자가 구현되어 있어 바로 객체를 생성하고 vector에 넘긴다. => 생성자/소멸자 count 감소!


vector의 원소를 다중 파라미터로 만들 경우(eg.vector<vector<int>>) push_back 함수는 구조체를 선언해 vector에 넣어야 하고, emplace_back은 내부에서 임의로 구조체를 생성해 할당하므로 별도의 구조체 선언을 요구하지 않는다.

단, 어떤 생성자가 선언되었는지 분명하지 않고 실수로 잘못된 파라미터를 입력해도 그대로 적용된다(오류로 판단하지 않음).

예를 들어 2차원 벡터에 상숫값을 집어넣어도 오류 로그를 출력하지 않고 그대로 벡터에 삽입된다.

(특정 위치에 상숫값을 삽입하지 않고 내부 함수 임의로 상수만큼의 벡터가 더 생성됨 => 개발자가 원하는 방향이 맞나?)


최적화된 최신 컴파일러를 사용하고 있다면 push_back을 사용하는 것이 좋겠다.


Leave a comment