C++에서는 C언어 보다 배열을 더 편하게 다룰 수 있는 방법이 존재합니다.
메모리 할당 등 여러 측면에서 편하게 사용할 수 있는 vector에 대해 알아보겠습니다.
vector란?
vector는 시퀀스 컨테이너로, C언어의 배열과 같은 동적 배열입니다.
C언어의 배열과 달리, 객체를 삽입하거나 제거할 때 자동으로 자신의 크기를 조정하는 능력이 있습니다.
vector의 이해를 위해, 시퀀스 컨테이너의 개념과 크기 조정에 대해 나누어 하나씩 설명해 보겠습니다.
컨테이너(container)
먼저, 시퀀스 컨테이너라는 개념에 대해 간단히 살펴보겠습니다.
STL에서 컨테이너(container)는 같은 타입의 여러 객체를 저장하는 일종의 집합이라고 할 수 있습니다.
컨테이너는 아래와 같이 크게 3가지로 분류됩니다.
- 데이터를 선형으로 저장하는 시퀀스 컨테이너(sequence container)
- 예 : vector, deque, list, forwad_list
- 데이터를 미리 정의된 순서(예: 오름차순 정렬)로 삽입하는 연관 컨테이너(associative container)
- 예 : set, multiset, map, multimap
- 간단 명료하게 인터페이스를 제한하는 연관 컨테이너의 변형인 컨테이너 어댑터(adapter container)
- 예 : stack, queue, priority_queue
컨테이너에 대한 자세한 설명은 아래 링크를 참고해 주세요
https://learn.microsoft.com/ko-kr/cpp/standard-library/stl-containers?view=msvc-170
자동으로 크기를 조정하는 Vector
vector의 크기 조정 기능에대해 살펴보겠습니다.
C언어에서 배열을 사용할 때에는 크기를 미리 지정해야했습니다. 배열의 크기를 조절하려면 malloc()이나 calloc()을 이용한 복잡한 동적 할당이 필요했지요.
하지만 vector는 자동으로 메모리를 할당해 주기 때문에, 처음부터 원소의 개수를 지정할 필요가 없습니다!
작동하는 방식은 stack과 유사하게 맨 뒤에서 삽입과 삭제가 일어납니다.
vector의 맨 뒤에서 삽입과 삭제가 일어나는 모습을 GIF로 만들어 보았습니다.
크기를 구하거나 중간 원소를 삭제해주는 등의 유용한 멤버 함수들이 많다는 것도 vector의 장점입니다.
물론, 맨 뒤가 아닌 중간 위치에서도 삽입삭제가 가능합니다.
하지만 중간 위치에서 원소의 삽입, 삭제가 자주 수행되는 경우 성능이 나빠지므로, 이런 경우에는 사용하지 않는 것이 좋습니다.
vector의 선언 및 사용
vector를 사용하기 위해서는 <vector> 헤더파일을 추가해 주어야 합니다.
간단한 사용 예시를 살펴보겠습니다.
#include <iostream>
#include <vector>
using namespace std;
int main(void) {
vector<int> v1 = { 1, 2, 3, 4, 5 };
vector<int> v2(v1);
v1.push_back(7);
v2.pop_back();
for (int i = 0; i < v1.size(); i++) {
cout << v1[i] << ' ';
}
cout << '\n';
for (int i = 0; i < v2.size(); i++) {
cout << v2[i] << ' ';
}
cout << '\n';
v2.swap(v1);
for (int i = 0; i < v1.size(); i++) {
cout << v1[i] << ' ';
}
cout << '\n';
for (int i = 0; i < v2.size(); i++) {
cout << v2[i] << ' ';
}
return 0;
}
[실행 결과]
소스코드를 보면 vector도 v[2]처럼 배열같이 사용이 가능한 것을 볼 수 있습니다.
vector를 선언하는 법은 다음과 같습니다.
- vector<int> v : int형의 빈 vector를 생성
- vector<int> v(n) : 0으로 초기화 된 n개의 원소를 가지는 int형의 vector를 생성
- vector<int> v(n, a) : a로 초기화 된 n개의 원소를 가지는 int형의 vector를 생성
- vector<int> v2(v1) : v1을 복사하여 v2 vector를 생성
- vector<vector<int>> : v int형의 2차원 vector 생성
- vector<int> v = {1, 2, 3, ... } : {1, 2, 3, ...} 으로 초기화 된 int형의 vector 생성
vector의 멤버 함수는 아래와 같습니다.
- v.push_back(m) : 마지막 원소 뒤에 원소 m 삽입
- v.pop_back() : 마지막 원소를 제거
- v.front() : 첫 번째 원소 반환
- v.back() : 마지막 원소 반환
- v.end() : 마지막 원소 다음을 가리키는 반복자(iterator)를 반환
- v.size() : 원소의 갯수를 리턴
- v2.swap(v1) : v1과 v2의 원소를 swap
vector에 대한 추가적인 내용들은 아래 링크들을 참고해 주세요
https://cplusplus.com/reference/vector/vector/
https://blockdmask.tistory.com/70
'학습 정리 > 📖 C,C++' 카테고리의 다른 글
[C에서 C++로 넘어가기] - 8. map, unordered_map (0) | 2023.05.19 |
---|---|
[C에서 C++로 넘어가기] - 7. 이진 탐색- binary_search(), upper_bound(), lower_bound() (0) | 2023.02.01 |
[C/C++] 카운팅 정렬 (Counting Sort) (0) | 2023.01.19 |
[C에서 C++로 넘어가기] - 5. 정렬하기 : sort (0) | 2023.01.04 |
[C에서 C++로 넘어가기] - 4. 문자열 입력받기 : String (0) | 2023.01.04 |