동적배열 (vector) 이란 크기가 가변적인 배열이다.
1. What is Vector Container?
-
메모리의 블럭을 관리해주는 객체
-
자동으로 메모리를 할당해주는 배열
-
벡터에 들어가는 자료형은 모두 동일해야 한다.
- 끝에 삽입 삭제를 하기위해서 쓰는 컨테이너! 동적 배열이다!
- STL : Standard Template Library, C++을 위한 템플릿 라이브러리!
- 사이즈보다 더 공간을 잡아서 쓰는 것이 capacity(하단 5번에서 설명)
vector 컨테이너는 자동으로 메모리가 할당되는 배열.정도로 생각해 볼 수 있다.
모든 STL 이 그렇듯. template를 사용하기 때문에 데이터 타입은 마음대로 넣을 수 있다.
맨 뒤쪽에서 삽입과 삭제가 가능하다.
중간에 값을 삽입 하거나 삭제할 수도 있으나, 배열기반이으로 중간 삽입 삭제가 빈번하게 일어난다면 비효율적이다!
마찬가지로, 맨 앞에 삽입하는 것도 비효율적이다.
중간이나 앞에 삽입하는 것은, 마치 서 있는 줄에 누군가가 새치기를 하는 상황과 같다. 번거롭고 오래걸린다.
2. Vector의 선언 및 사용
- <vector> 헤더파일 추가
- namespace 추가 // std:: 사용 (using namespace std;)
- 벡터 선언 : vector<[data type]> [변수이름]
ex) vector<int> Vec
3. vector의 생성자와 연산자 (편의상 int를 사용)
- vector<int> V;
- 비어있는 vector V를 생성한다. - vector<int> V(5);
- 기본값(0)으로 초기화 된 5개의 원소를 가지는 vector V를 생성한다. - vector<int> V(5, 2);
- 2로 초기화된 5개의 원소를 가지는 vector V를 생성한다. - vector<int> V1(5, 2);
vector<int> V2(v1);
- V2는 V1 vector를 복사해서 생성한다.
- vector<int> V1; , vector<int> V2; 가 있고, 내부에 인자들이 있다고 했을때,
연산자 : "==", "!=", "<", ">", "<=", ">=" 로 대소비교 가능하다. - ex)
4. vector의 멤버 함수
== vector<int> V; 라고 가정.
== 참조 한다는 것은 해당 데이터를 리턴 한다는 뜻입니다.
-
V.assign(5, 2);
- 2의 값으로 초기화하고, 5개의 원소 할당. -
V.at(idx);
- idx번째 원소를 참조한다.
- v[idx] 보다 속도는 느리지만, 범위를 점검하므로 안전하다. -
V[idx];
- idx 번째 원소를 참조한다.
- 범위를 점검하지 않으므로 속도가 V.at(idx)보다 빠르다. -
V.front();
- 첫번째 원소를 참조한다. -
V.back();
- 마지막 원소를 참조한다. -
V.clear();
- 모든 원소를 제거한다.
- 원소만 제거하고 메모리는 남아있다.
- size만 줄어들고 capacity는 그대로 남아있다. -
V.push_back(7);
- 마지막 원소 뒤에 원소 7을 삽입한다. -
V.pop_back();
- 마지막 원소를 제거합니다. -
V.begin();
- 첫번째 원소를 가리킵니다. (iterator와 사용) -
V.end();
- 마지막의 "다음"을 가리킨다 (iterator와 사용) -
V.rbegin();
- reverse begin을 가리킨다 (거꾸로 해서 첫번째 원소를 가리킨다)
- iterator와 사용. -
V.rend();
- reverse end 을 가리킨다 (거꾸로 해서 마지막의 다음을 가리킨다)
- iterator와 사용. -
V.reserve(n);
- n개의 원소를 저장할 위치를 예약 (미리 동적할당 해놓는다) -
V.resize(n);
- 크기를 n으로 변경한다.
- 더 커졌을 경우 default값인 0으로 초기화 한다.
-
V.resize(n,3);
- 크기를 n으로 변경한다.
- 더 커졌을 경우 인자의 값을 3으로 초기화한다.
-
.size();
- 원소의 갯수를 리턴한다. - V.capacity();
- 할당된 공간의 크기를 리턴한다.
- 공간 할당의 기준은 점점 커지면서로 capacity를 할당하게 된다.
**size와 capacity에 관계는 4번 항목에서 설명! 중요하니 꼭 이해할 것!
- V2.swap(V1);
- V1과 V2의 원소와 capacity 바꿔준다. (모든걸 스왑해줌)
- V1의 capacity를 없앨때 (할당한 메모리를 프로그램이 끝나기 전에 없애고 싶을때) 사용하기도 함.
- V2를 capacity가 0인 임시 객체로 만들어서 스왑을 해준다.
- vector<int>().swap(V1); - V.insert(2, 3, 4);
- 2번째 위치에 3개의 4값을 삽입. (뒤엣놈들은 뒤로 밀림)
- 쓰지 않는 것이 맞다. 비효율적이다!! - V.insert(2, 3);
- 2번째 위치에 3의 값을 삽입.
- 삽입한 곳의 iterator를 반환. - V.erase(iter);
- iter 가 가리키는 원소를 제거.
- size만 줄어들고 capacity(할당된 메모리)는 그대로 남는다.
- erase는 파라미터 하나를 받을때와 두개를 받을 때 다르다.
- 그에 따른 예제는 여기있다.
- V.empty()
- vector가 비었으면 리턴 true
- 비어있다의 기준은 size가 0이라는 것이지, capacity와는 상관이 없다.
5. vecotr의 size와 capacity와의 관계 (중요!)
동적배열은 할당과 해제가 빈번하기 때문에 여유공간을 잡아주어, 자주 이사를 가지 않도록 만들어 주는 것이 좋다.
즉, 사이즈보다 더 공간을 잡아서 쓰는 것, capacity 이다.
6. vector의 멤버 형식
-
iterator - 반복자 형식
-
reverse_iterator - 역 반복자 형식
-
value_type - 원소의 형식
-
size_type - 원소의 개수의 형식
7. vector 멤버함수와 size, capacity 이해하기
위 코드를 실행해 보면 3과 5가 나온다.
명심할 점은, 구조체를 정의할 때 구조체는 아직 크기를 갖지 않는다는 사실이다.
따라서 구조체 안의 멤버 함수도 오직 객체를 통해서만 호출이 가능하다!
clear 로 size는 지워지나, capacity는 그대로 남아있다!
할당 계속 되어있는 상황.
동적배열이니, 런타임에 배열의 사이즈를 정하도록 만들어보자.
A의 사이즈만큼 A[ ]를 출력해주는 반복문이다.
push_back(Input) 을 통해 동적배열의 맨 뒤에 값을 직접 추가할 수 있도록 만들었다.
실행시킨 후에 순서대로 10, 20, 30,. 40 을 입력해 보자!
반드시 마지막에 할당 해제를 해 주어야 한다.
A. clear()
A.shrink_to_fit() 둘 모두 순서대로 사용해 주어서 할당해제해주자.
참조:
https://blockdmask.tistory.com/70 [개발자 지망생]
https://egg-money.tistory.com/161 [완숙의 블로그]
'C++ 코딩 > C++ 기초개념' 카테고리의 다른 글
<C++ 기초> 공용체 union (0) | 2021.03.18 |
---|---|
<C++ 기초> 구조체 struct, 구조체 응용(*포인터 인수로 사용하기) (0) | 2021.02.24 |
<C++ 기초> 클래스 Class의 기본 - 맴버, 멤버함수, private, public, protect, 캡슐화 (1) | 2021.02.24 |
<C++ 기초> 식과 연산자, 연산자의 종류와 우선순위 (0) | 2021.02.23 |
<C++ 기초> typedef, 열거형 enum (0) | 2021.02.16 |
<C++ 기초> 문자열 조작하기 -char[], string (0) | 2021.02.15 |
<C++ 기초> 메모리 동적 확보, 배열의 동적인 확보 (0) | 2021.02.14 |
<C++ 기초> 변수와 스코프(지역변수와 전역변수) 02.14 (0) | 2021.02.14 |