*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 |