1. 특징
- 어떤 자료형도 넣을 수 있는 동적 배열
- 원시 자료형(primitive data)
- 클래스
- 포인터
- 모든 요소가 연속된 메모리 공간에 위치
- 자동으로 메모리를 관리
- 임의의 요소에 접근 가능 (인덱스 사용 가능)
- vector는
operator[]
를 사용할 수 있지만, STL 컨테이너를 순회할 때는 반복자(iterator)를 사용하는 것이 표준 방식
2. [장점]
- 순서에 상관없이 요소에 임의적 접근 가능
- 제일 마지막 위치의 요소를 빠르게 삽입 및 삭제 가능 (메모리 재할당이 없을 시)
3. [단점]
- 중간에 요소 삽입 및 삭제는 느리다.
- 재할당 및 요소 복사에 드는 비용이 크다.
4. 벡터 변수 생성 방법
- 빈 벡터의 생성
// std::vector<type><name>
std::vector<int> scores;
std::vector<std::string> names;
std::vector<Cat> myCats;
std::vector<Cat *> myCats;
- 벡터를 복사하여 생성
// std::vector<type><name>(const vector& x)
std::vector<int> scores;
scores.push_back(1);
scores.push_back(2);
std::vector<int> scoreCopy(scores); // scores의 사본
- 크기(size)를 지정하여 vector를 생성→ 거의 사용하지 않음
// std::vector<type><name>(size)
std::vector<int> scores(10); // 모든 요소의 값은 0으로 초기화 해준다.
std::vector<Cat> mycats(4);
- 실제 오브젝트를 만들어서 넣어준다.
- C#에서는 요소를
<size>
만큼 넣을 수 있는 공간을 제공해준다. - C++에서는 선언 시에 용량이 몇인지 정하는 생성자가 없음.
reserve()
함수를 호출해 주는 것이 좋다.
5. 벡터 사용법
- push_back(
<data>
): 제일 마지막에 요소를 추가한다. - pop_back(): 제일 마지막의 요소를 제거한다.
- operator[](
size_t n
): 지정된 위치의 요소를 참조로 반환한다. - insert(iter, value): 특정 위치에 요소를 삽입한다.
→ 값을 맨 앞에 추가하려고 할 때, 이미 있는 값들을 저장해두기 위해서 모든 값들을 복사 해놓아야 한다. 따라서 복사하려고 하는 인스턴스의 크기가 클 때, 성능이 저하되는 문제가 발생한다.
→ 위와 같은 상황에서 추가하려고 하는 요소를 넣을 공간이 없을 때, 인스턴스를 복사를 하고 가지고 있었던 공간 보다 큰 공간을 재할당 한 뒤 붙여 넣는다.
- erase(iter): 특정 위치에 있는 요소를 삭제한다.
- assign(size, value): 특정 크기만큼 값을 넣어 벡터를 채운다.
- resize(size): 벡터의 크기를 변경한다.
- 벡터의 크기를 바꾼다.
- 새 크기가 vector의 기존 크기보다 작으면, 초과분이 제거된다.
- 새 크기가 vector의 용량보다 크면 재할당이 일어남.
- clear(): 벡터를 비운다.
- size는 0이 되고, 이미 할당된 용량은 변하지 않는다.
→ 이터레이터는 erase
를 사용할 시, 그 다음 요소를 반환한다. 반복문을 사용할 때, iter = scores.erase(iter);
대입을 해야한다는 사실.
6. 용량과 크기
capacity()
: vector에 할당된 요소 공간 수 (최대 들어갈 수 있는 요소의 수)size()
: vector에 실제로 들어있는 요소의 수
→ Byte가 아님!!
- vector의 용량 늘리기
reserve(size)
: 용량이 증가해야 하면 새로운 저장 공간을 재할당하고 기존 요소들을 모두 새 공간으로 복사한다.- size가 기존 용량보다 작으면 아무 일도 일어나지 않는다.
- 불필요한 재할당을 막기 위해서 vector를 생성한 직후에
reserve
로 벡터의 공간을 잡아주자.- 컴파일러가 선언 뒤에 있는
reserve()
를 포착하고 그 크기만큼 공간을 잡게끔 최적화를 해주었다.
- 컴파일러가 선언 뒤에 있는
7. Vector의 Iterator
std::vector<type>::iterator iter;
begin()
: 첫 번째 요소를 가리키는 iterator를 반환한다.end()
: 마지막 인자 뒤의 요소를 가리키는 iterator를 반환한다.
std::vector<type>::const_iterator iter;
- 원본을 바꿀 수 없는 반복자.
- 뒤에서부터 접근하는 reverse iterator
std::vector<type>::reverse_iterator iter;
8. 포인터를 저장하는 벡터
- 개체를 직접 보관하는 벡터의 문제점
- 개체가 가지고 있는 인스턴스의 메모리가 너무 크다면 그 값들을 전부 복사해오는 데에 효율을 떨어뜨릴 수 있다.
push_back
또는insert
,erase
를 사용했을 때 원본 데이터들을 모두 복사해서 가져와야 하는 문제가 발생할 수 있다.- 대입 연산자 혹은 복사 생성자를 사용할 때도 같은 문제가 발생함.
- 개체가 가지고 있는 인스턴스의 메모리가 너무 크다면 그 값들을 전부 복사해오는 데에 효율을 떨어뜨릴 수 있다.
- 이러한 문제로 인해 포인터를 저장하는 벡터를 사용한다.
- 자바는 모든 오브젝트들이 레퍼런스 타입이다.
'Language > C++' 카테고리의 다른 글
[C++] 36.Unmanaged Programming: 템플릿 프로그래밍 (0) | 2024.01.31 |
---|---|
[C++] 35.Unmanaged Programming: Map (1) | 2024.01.31 |
[C++] 33.Unmanaged Programming: STL 표준 템플릿 라이브러리 (0) | 2024.01.31 |
[C++] 32.Unmanaged Programming: 적절한 예외 처리 (0) | 2024.01.31 |
[C++] 31.Unmanaged Programming: Exception (1) | 2024.01.31 |