프로그래밍/C++

#55. vector

코딩하는상후니 2022. 7. 21. 22:00

 

*STL ( Standard Template Library )
 
 
*시퀀스 컨테이너 ( Sequence Container )  ( 선형 자료구조 )
=> 데이터가 삽입 순서대로 나열되는 형태
=> vector, list, deque...
 

 
*vector
 
*임의 접근 용이.
=> operator [ ]
 
 
*중간 삽입  /  삭제
=> 굉장히 비효율적
=> vector 는 '연속적' 이어야 하는 보장이 있어야 하기 때문.
 
 
*처음  /  끝  -> 삽입 & 삭제
=> 처음 위치에 삽입 / 삭제 : 중간 삽입과 마찬가지로 비효율적.
=> 끝 위치에 삽입  /  삭제 : 효율적
 
 
 
*배열의 단점
=> 고정크기, 유동적이지 못함.
 
 
*동적 배열
1. '여유분' 의 메모리를 할당.
2. 여유분까지 꽉 찼으면 메모리 증설.
 
 
 
*여유분 개념 ( capacity )
=> 여유분은 얼만큼이 적당할까 ??
=> 여유분을 얼만큼 증설 해야할까 ??
=> 증설 시, 기존에 있던 메모리는 어떻게 되는가 ??
 
 
size  :  실제 데이터 개수
capacity  :  여유분을 포함한 용량 개수 ( 역으로 줄어들진 않음. )
 
 
*여유분 초과 시, ( 현재 capacity * 1.5 ) 만큼 의 '연속적인' 메모리 할당.
*기존 메모리에서 새로 할당된 메모리에 복사.
 
 
v.reserve(  ) => capacity (용량) 예약
 
 
vector<int> vec (1000, 0) ;   => resize 와 같은 개념
v.resize(  )   => 해당 크기만큼 벡터의 크기 / 용량 만듬.
1. capacity 가 resize 크기 보다 작다면 같은 크기로 늘려줌.
2. 데이터 한번 추가 시, size += 1 되고 capacity 가 증가되고 새로운 메모리 할당.
3. 기존 데이터 크기보다 작은 크기로 resize 시, 나머지 부분 제거.
 
 
v.clear( )
=> clear 함수를 써도 capacity 는 줄어들지 않음.

 

 
*vector<int>::size_type
for (vector<int>::size_type i = 0; i < vec.size(); ++i)
 
 

 
 
*반복자 ( iterator )
 
=> 포인터와 유사한 개념
vector<int>::iterator it;
 
vector<int>::iterator beginIt = vec.begin();
=> 해당 vec 첫번째 주소 반환
 
vector<int>::iterator endIt = vec.end();
=> vec.end( ) 는 해당 vec 마지막 주소 + 1 을 반환

=> vectorContainer 의 _Myfirst  /  _Mylast 값을 이용해 begin(), end() 를 가져옴.
즉, _Mylast 값에는 마지막 데이터 주소 + 1 의 값을 가지고 있음.
 
vector<int>::iterator beginIt = vec.begin(); 
vector<int>::iterator endIt = vec.end(); 
for (auto it = vec.begin(); it != vec.end(); ++it) 
{ 
	cout << *it << endl; 
}

int* ptrBegin = vec.begin()._Ptr; 
int* ptrEnd = vec.end()._Ptr; 
for (int* ptr = ptrBegin; ptr != ptrEnd; ++ptr) 
{ 
	cout << *ptr << endl; 
}
 
 
 

* const iterator ( const int* 와 유사한 개념 )

vector<int>::const_iterator cIt = vec.cbegin();
 

 

 

*역방향 반복자
vector<int>::reverse_iterator rIt = vec.rbegin(); 
for (auto rIt = vec.rbegin(); rIt != vec.rend(); ++rIt) 
{ 
	cout << *rIt << endl; 
}
 
 
 
*Insert
vector<int> v; 
v.push_back(1); 
v.push_back(2); 
v.push_back(3); 
v.push_back(4); 
v.push_back(5); 
vector<int> v2; 
v2.push_back(101); 
v2.push_back(102); 

auto insertIt = v.insert(v.begin() + 2, 100); 
auto insertRangeIt = v.insert(v.begin() + 2, v2.begin(), v2.end()); 
auto eraseIt = v.erase(v.begin() + 2); 
auto eraseIt2 = v.erase(v.begin() + 2, v.begin() + 4);

 

=> 해당 시작점을 다시 Iterator 로 반환함.

=> 해당 iterator 를 erase 시 iterator 를 다시 쓸 수 없음. 다시 받아줘야함.
 
for (auto It = v.begin(); It != v.end();) 
{ 
	if (*It == 3) It = v.erase(It); 
	else It++; 
}
 
 

 

본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다.
 

'프로그래밍 > C++' 카테고리의 다른 글

#57. deque  (0) 2022.07.21
#56. list  (0) 2022.07.21
#54. 콜백함수  (0) 2022.07.20
#53. 클래스 템플릿  (0) 2022.07.20
#52. 함수 템플릿  (0) 2022.07.20