#Vector
-> 템플릿이다.
백터 사용을 위해서
#include <vector>를 추가해주고
vector<자료형> 변수명;
으로 해주면 된다.
1. 원소 삽입
변수명.push_back(자료);
#include <vector>
void main()
{
vector<int> vecint;
vecint.push_back(10);
}
2. 원소 삭제 (뒤에서 부터)
변수명.pop_back();
-> 맨 뒤에서 부터 삭제된다.
3. 원소 개수 및 메모리 할당 개수
변수명.size();
-> vector에 저장된 원소의 개수를 반환하는 함수
변수명.capacity();
-> vector에 할당 된 메모리의 개수
-> 할당 된 메모리 수 이기 때문에, 원소를 삭제 하여도 공간이 줄어 들거나 하지 않는다.
-> vector의 메모리 할당 방식
vector는 메모리 개수를 초과하는 삽입이 있을경우 재할당 및 복사가 이루어 지는데,
재할당은 기존메모리개수 >>1 만큼 추가로 재할당이 발생한다.
소수점 아래는 버림이다.
예를들어, 5의 capacity를 갖고있는 벡터에
5개가 이미 차있는상태에서 1개의 원소를 삽입하였을 때,
기존메모리수 5에서 >>1 의 값 즉, 2가 늘어나게 되고
이때 size는 6, capacity는 7이 되게 된다.
4. 모든 원소 삭제
변수명.clear();
5. 원소 유무 검사
변수명.empty();
-> 원소가 비어 있을 경우 true, 비어있지 않을 경우 false를 반환한다.
6. 두 벡터의 모든 원소와 메모리 교환
변수명.swap(다른벡터변수);
-> 임시객체를 이용하여 메모리 소멸이 가능하다.
ex) vecInt.swap(vector<int>());
7. 첫 번째 원소, 마지막 원소에 접근
변수명.front(); // 첫번째 원소
변수명.back(); // 마지막 원소
#반복자
->컨테이너 내부에 정의되어있는 객체로, 반복자를 통해 순회, 탐색 등이 간편해진다.
포인터와 비슷하게 동작함(포인터가 아니라 객체이다)
vector<자료형>::iterator 변수명;
초기화는 아래의 반복자를 반환하는 함수를 이용하여 진행한다.
begin(); -> 첫번째 원소를 가리키는 반복자를 반환
end(); -> 마지막 원소 다음 위치를 가리키는 반복자를 반환
ex)
vector<int>::iterator iter_begin = vecInt.begin();
반복자를 통해 원소 순회
for (; iter_begin != iter_end; ++iter_begin)
cout << *iter_begin << endl; // 원소 출력을 위해 *를 붙여줌
#반복자 종류
종류 | 임의 접근 반복자 | 양 방향 접근 반복자 |
기반 | 배열 | 노드 |
사용 | ++, --, [], +=, -= | ++, -- |
ex) iter_begin[3];
iter_begin +=3;
8. 중간 삽입 및 중간 삭제
insert(삽입위치를 가리키는 반복자, 삽입할 데이터)
ex)
vecInt.insert(iter_begin,999);
여기서 iter_bein에 +=3 값 등을 넣어서 가리키는 위치를 변경 할 수 있다.
erase(삭제위치를 가리키는 반복자)
ex)
vecInt.erase(iter_begin);
*반복자를 사용하여, 중간삽입이나 중간삭제를 할 때 주의점이 있다.
iter_begin을 통해 중간삽입을 하게되면, 뒤에 원소들은 뒤로 밀리게 되고,
그렇게 되면 iter_end는 다른 곳을 가르키게 된다.
iter_begin을 통해 중간삭제를 하게되면, iter_begin에 있던 원소는 삭제되게 되고,
그렇게 되면 iter_begin이 가리키던 원소가 삭제되기 때문에 iter_begin은 무효화가 발생하게 된다.
#메모리 예약
vector의 메모리를 예약할 수 있는 방법이 두가지이다.
생성자를 통해,
vector<int> vecInt(10);
위와 같이 10을 써넣으면 10만큼 메모리 용량을 잡아 둔다.
근데 이때는 10의 메모리에 값이 채워지기 때문에
size와 capacity 둘다 체크해보면 10으로 출력되는 것을 알 수 있다.
이때는 clear(); 를 통해 초기화 후 사용 할 수 있다.
값이 없이 메모리만 잡아 두는 방법도 있다.
vector<int> vecInt;
vecint.reserve(10);
위와 같이 메모리를 할당해두면, 값은 채워지지 않고 메모리만 예약해두기 때문에
size를 찍었을 때, 0이 나오게 된다.
'개발 Study' 카테고리의 다른 글
#39. List (0) | 2021.05.24 |
---|---|
#38. 조건자 (0) | 2021.05.23 |
#36. STL (Standard Template Library) 정의 (0) | 2021.05.22 |
#35. 클래스 템플릿 (0) | 2021.05.21 |
#34. Template 및 inline (0) | 2021.05.20 |