Taene's
[C++] std::vector 본문
- vector는 배열과 비슷하게 사용할 수 있고 map을 사용할때 iter->first는 키값을 가리키고 iter->second는 밸류값을 가리킨다.
<Vector의 초기화>
vector<자료형> 변수명 | 백터 생성 |
vector<자료형> 변수명(숫자) | 숫자만큼 백터 생성 후 0으로 초기화 |
vector<자료형> 변수명 = { 변수1, 변수2, 변수3... } | 백터 생성 후 오른쪽 변수 값으로 초기화 |
vector<자료형> 변수명[] = {, } | 백터 배열(2차원 백터)선언 및 초기화(열은 고정, 행은 가변) |
vector<vector<자료형>> 변수명 | 2차원 백터 생성(열과 행 모두 가변) |
vector<자료형>변수명.assign(범위, 초기화할 값) | 백터의 범위 내에서 해당 값으로 초기화 |
<Vector의 Iterators>
v.begin() | 백터 시작점의 주소 값 반환 |
v.end() | 백터 (끝부분 + 1) 주소값 반환 |
v.rbegin() (revers begin) | 백터의 끝 지점을 시작점으로 반환 |
v.rend() (revers end) | 백터의 (시작 + 1) 지점을 끝 부분으로 반환 |
<Vector 요소 접근>
v.at(i) | 백터의 i번째 요소 접근 (범위 검사함) |
v.[i] (operator []) | 백터의 i번째 요소 접근 (범위 검사 안함) |
v.front() | 백터의 첫번째 요소 접근 |
v.back() | 백터의 마지막 요소 접근 |
- at은 범위를 검사하여 범위 밖의 요소에 접근 시 예외처리를 발생시킨다. (std::out_of_range)
하지만 [](operator [])는 범위검사를 하지 않으며 예외처리를 발생시키지 않는다.
또한 해당범위 밖의 요소에 접근을 시도한다면 일반적인 디버깅이 발생한다.
<Vector에 요소 삽입>
v.push_back() | 백터의 마지막 부분에 새로운 요소 추가 |
v.pop_back() | 백터의 마지막 부분 제거 |
v.insert(삽입할 위치의 주소 값, 변수 값) | 사용자가 원하는 위치에 요소 삽입 |
v.emplace(삽입할 위치의 주소 값, 변수 값) | 사용자가 원하는 위치에 요소 삽입(move로 인해 복사생성자 X) |
v.emplace_back() | 백터의 마지막 부분에 새로운 요소 추가(move로 인해 복사생성자 X) |
v.erase(삭제할 위치) or v.erase(시작위치, 끝위치) | 사용자가 원하는 index값의 요소를 지운다. |
v.clear() | 백터의 모든 요소를 지운다.(return size = 0) |
v.resize(수정 값) | 백터의 크기를 조정한다.(범위 초과시 0으로 초기화) |
v.swap(백터 변수) | 백터와 백터를 스왑한다. |
- push_back()이나 insert()는 추가할 원소를 먼저 임시로 생성한 후, 벡터 버퍼 내부 위치로 복사/이동을 수행한다.
이 단점은 새로운 원소가 추가될 위치에서 해당 원소를 생성하는 방식으로 최적화할 수 있고,
emplace_back()이나 emplace() 함수를 사용하면 성능 향상에 도움이 된다.
이 경우 새 원소 위치에서 바로 객체가 생성되기 때문에 함수 인자에 생성된 객체를 전달하는 게 아니라 생성자에 필요한 매개변수를 전달해야 한다. (전달된 생성자 인자를 적절하게 사용해 객체를 생성하고 삽입함)
- push_back()의 의사코드(pseudocode)
push_back(val):
if size < capacity // 원소를 추가할 공간이 있는 경우
- 마지막 원소 뒤에 val 추가
- 벡터 크기를 1만큼 증가
- return;
if vector is already full // 할당된 메모리 공간이 가득 차 있는 경우
- 2*size 크기의 메모리를 새로 할당
- 새로 할당한 메모리 공간에 기존 원소들을 복사
- 데이터 포인터를 새로 할당한 메모리 주소로 지정
- 마지막 원소 뒤에 val 추가하고, 벡터 크기를 1만큼 증가
<Vector 용량>
v.empty() | 백터가 빈공간이면 true, 값이 있다면 false |
v.size() | 백터의 크기 반환 |
v.capacity() | heap에 할당된 백터의 실제크기(최대크기) 반환 |
v.max_size() | 백터가 system에서 만들어 질 수 있는 최대 크기 반환 |
v.reserve(capacity) | 백터에서 사용할 용량을 설정 |
v.shrink_to_fit() | capacity의 크기를 백터의 실제 크기에 맞춤 |
- reserve(capacity): 매개변수로 지정한 값이 현재 용량보다 크면 메모리를 매개변수 크기만큼 재할당하지만, 매개변수 값이 현재 용량보다 같거나 작으면 아무런 동작을 하지 않는다. 벡터의 크기를 변경하지는 않는다.
- shrink_to_fit(): 여분의 메모리 공간을 해제하는 용도로 사용된다. 이 함수를 호출하면 벡터의 용량이 벡터 크기와 같게 설정된다. 벡터의 크기가 더 이상 변경되지 않을 때 사용하면 유용하다.
'C++ 개념 공부 > STL' 카테고리의 다른 글
[C++] 동적 크기 배열 구현하기(dynamic_array) (0) | 2024.05.13 |
---|---|
[C++] 파일 입출력(fstream) (0) | 2024.04.02 |
[C++] std::memset (0) | 2024.03.15 |
[C++] std::map (0) | 2023.09.11 |
[C++] std::stack (0) | 2023.09.04 |