Vector
- 배열인데, 동적으로 크기를 확장 또는 축소가 가능하게 되어있는 자료구조(크기조절 시 오버헤드가 크다.)
- 데이터의 위치를 알고 있으면 랜덤 액세스(임의 접근)가 가능하다.
- array(배열)에 비해 성능은 떨어지지만 메모리를 효율적으로 관리하고 예외처리가 쉽다는 장점이 있다.
- 추가되거나 삽입될 때 메모리 재할당이 발생할 수 있고 상당한 부하가 발생하게 된다는 점은 단점으로 꼽히고 있다.
Vector 구조
front() : 첫 번째 원소 - 5
back() : 마지막 원소 - 10
begin() : 첫번째 위치 - [0]
end() : 마지막의 다음 위치
size() : 원소의 개수 - 4
capacity() : 할당된 공간의 크기 - 용량(6)
특징
size와 capacity가 따로 있는 이유
- 매번 새로운 원소가 들어올 때마다 새로운 메모리가 할당되는 것은 비효율적이다.
- vector는 새로운 원소가 벡터에 추가되면 메모리 공간을 추가적으로 할당되는 방식으로 이루어져 있습다.
- capacity가 모자랄 경우 capacity/2 만큼의 capacity를 늘려나가게 된다.
- 만약 입력될 원소의 개수를 알 수 있다면 reserve를 사용하여 미리 capapcity 메모리를 할당해 놓으면
- 좀 더 호율적으로 vector를 사용할 수 있다.
Vector 사용법
Vector 선언
#include <vector> // vector가 들어있는 헤더파일
vector<int> v; // int타입 벡터 생성
vector<int> v = { 1, 2, 3}; // int형 백터 생성 후 1, 2, 3 으로 초기화
vector<int> v[10]; // int타입 벡터 배열(크기 : 10) 생성
vector<int> v[] = {{ 1, 2}, {3, 4}}; // int형 백터 배열 생성(행은 가변이지만 열은 고정)
vector<vector<int>> v; // 2차원 백터 생성(행과 열 모두 가변)
vector<int> v(5); // 5개의 원소를 0으로 초기화
vector<int> v(5, 3); // 5개의 원소를 3으로 초기화
vector<int> v2(v); // 벡터 v를 복사하여 벡터v2 생성
Vector를 사용하기 위해서는 <vector>라는 헤더 파일을 먼저 include 한 뒤 위와 같이 선언하여 사용하면 됩니다. 편의상 예시의 자료형은 모두 int이며 안에 다른 자료형이나 class를 넣어도 됩니다
Vector 값 삭제
v.pop_back(); // 마지막에 넣은 값 제거
v.erase(vec.begin()+10); // index 10의 값을 제거
v.erase(vec.begin(), vec.begin()+5); // index 0~5의 값을 제거
v.clear(); //모든 값 제거
Vector의 끝에 있는 값을 삭제하려면 Vector의 pop_back()이라는 메서드를 사용하면 되고. 중간에 있는 값을 삭제하고 싶다면 eraser(index, index)함수를 사용하면 됩니다. eraser를 사용하여 특정 인덱스의 값을 제거하면 바로 뒤에 있는 인덱스부터 마지막 인덱스까지 모두 앞으로 한 칸씩 앞으로 당겨집니다. 모든 값을 제거하려면 clear() 메소드를 사용하면 됩니다.
Vector 크기 구하기
v.size(); //vector의 원소 갯수
v.capacity; //vector의 물리적 크기
Vector의 값이 들어있는 개수를 구하려면 size() 메소드를 사용하면 되고 물리적 크기를 알고 싶다면 capacity() 메소드를 사용하면 됩니다.
Vector 값 출력
vector<int> v;
for (int i=0; i<5; i++)
v.push_back(i); //vector 요소 추가
for (int i = 0; i < v.size(); i++)
cout << v[i] << " "; //모든 값 출력 : 0 1 2 3 4
cout << v[2] << endl; //index 2의 값 출력 : 2
cout << v.front() << endl; //처음 요소 출력 : 0
cout << v.back() << endl; //마지막 요소 출력 : 4
Vector에서 값을 출력하는 방법은 배열과 동일합니다. 추가로 처음의 값을 출력하고 싶다면 front() 메서드, 끝 값을 출력하고 싶다면 back() 메서드를 사용하면 됩니다.
Iterator를 활용하여 Vector 값 출력
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// 1~5의 숫자를 Vector에 저장
vector<int> v1;
for (int i = 1; i <= 5; i++)
v1.push_back(i);
// Iterator로 Vector의 아이템을 출력
// begin() : 첫번째 위치의 Iterator를 리턴
// v1.end() : 마지막 아이템 다음 위치의 Iterator를 리턴
for (auto i = v1.begin(); i != v1.end(); ++i)
cout << *i << " ";
// 반대 방향으로 아이템을 출력
// rbegin(), rend()는 역순(reverse)의 Iterator를 리턴
cout << "\n";
for (auto ir = v1.rbegin(); ir != v1.rend(); ++ir)
cout << *ir << " ";
// 배열처럼 Vector[index] 으로 아이템 출력
cout << "\n";
for (int i = 0; i < v1.size(); i++)
cout << v1[i] << " ";
// Vector.at(index)로 아이템 출력
cout << "\n";
for (int i = 0; i < v1.size(); i++)
cout << v1.at(i) << " ";
return 0;
}
iterator를 활용하여 vector를 출력할 수도 있습니다.