Taene's

[C++] std::vector 본문

C++ 개념 공부/STL

[C++] std::vector

taene_ 2024. 5. 15. 22:56

- 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