C++
2024.02.29 - vector
강병곤
2024. 3. 3. 21:19
- vector
vector는 자동으로 메모리가 할당되는 배열이라고 할 수 있다. 배열은 생성시 크기를 정해주어야 하고 그 크기가 가변적이지 않지만, vector는 배열과 비슷하지만 크기가 자동으로 늘어날 수 있다. 다만 속도적인 측면에서 배열에 비해 떨어진다는 단점이 있다.
- vector의 사용
vector를 사용하기 위해서는 <vector> 헤더파일을 추가해야한다. vector의 선언은 아래와 같이 이루어진다.
std::vector<데이터타입> 변수이름;
vector는 표준 라이브러리에 있는 클래스이므로 범위 지정 연산자로 std에서 왔음을 밝혀야한다.
- vector를 생성하는 다양한 예제
#include<vector>
int main() {
//1. 비어있는 vector 생성
std::vector<int> vec1;
//2. 기본값이 0으로 초기화된 요소 5개를 가지는 vector 생성
std::vector<int> vec2(5);
//3. 기본값이 2로 초기화된 요소 5개를 가지는 vector 생성
std::vector<int> vec3(5, 2);
//4. vec3를 복사하여 vec4 생성
std::vector<int> vec4(vec3);
//5. 벡터 생성후 1, 2, 3 으로 초기화 (요소 3개를 가짐)
std::vector<int> vec5 = { 1,2,3 };
}
- vector의 값 참조하는 여러가지 방법
#include<iostream>
#include<vector>
int main() {
std::vector<int> vec5 = { 1,2,3,4,5 };
//1. 배열 처럼 vec5[인덱스]로 참조하기
std::cout << vec5[1] << std::endl;
//2. vector의 멤버 함수 .at(인덱스)로 참조하기
std::cout << vec5.at(2) << std::endl;
//3. vector의 멤버 함수 .front()로 첫번째 요소 참조하기
std::cout << vec5.front() << std::endl;
//4. vector의 멤버 함수 .back()으로 마지막 요소 참조하기
std::cout << vec5.back() << std::endl;
}
- push_back(), pop_back()
vector의 마지막 요소를 추가하거나 제거할 수 있다.
#include<iostream>
#include<vector>
int main() {
std::vector<int> vec5 = { 1,2,3,4,5 };
//vec5의 마지막 요소로 6을 추가한다.
vec5.push_back(6);
std::cout << vec5.back() << std::endl;
//vec5의 마지막 요소를 제거한다.
vec5.pop_back();
vec5.pop_back();
std::cout << vec5.back() << std::endl;
}
- vector의 size와 capacity
vector의 멤버 함수 size()는 vector의 원소의 개수를 리턴한다. capacity()는 vector에 할당된 공간의 크기를 리턴한다.
#include<iostream>
#include<vector>
int main() {
std::vector<int> vec5 = { 1,2,3,4,5 };
std::cout << vec5.size() << std::endl;
std::cout << vec5.capacity() << std::endl;
}
얼핏 size와 capacity는 다른 것 같지 않아 보인다. 그러나 vector의 원소의 갯수를 늘려보면 차이가 있음을 알 수 있다.
#include<iostream>
#include<vector>
int main() {
std::vector<int> vec5 = { 1,2,3,4,5 };
vec5.push_back(6);
std::cout << "size : " << vec5.size() << std::endl;
std::cout << "capavity : " << vec5.capacity() << std::endl;
std::cout << "=======" << std::endl;
vec5.push_back(7);
std::cout << "size : " << vec5.size() << std::endl;
std::cout << "capavity : " << vec5.capacity() << std::endl;
std::cout << "=======" << std::endl;
vec5.push_back(8);
std::cout << "size : " << vec5.size() << std::endl;
std::cout << "capavity : " << vec5.capacity() << std::endl;
std::cout << "=======" << std::endl;
}
요소의 개수가 늘어날 때마다 메모리가 증가하는 것이 아니라, 한번 메모리가 늘어날 때 미리 공간을 어느정도 할당해 놓는 것을 알 수 있다. push_back이 일어날 때마다 동적할당을 하면 비효율적이므로 미리 정해둔 만큼 동적할당을 한번에 하는 것이다.