개발 Study

#37. Vector

HYuk 2021. 5. 23. 03:23
728x90

#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이 나오게 된다.

728x90

'개발 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