본문 바로가기

c++/STL

vector

https://blockdmask.tistory.com/70?category=249379

 

[C++] vector container 정리 및 사용법

안녕하세요.  BlockDMask 입니다. 오늘은 C++ STL의 sequence container 중에 정말 자주 쓰는 vector에 대해서 알아보겠습니다. <목차> 1) vector container 란? 2) vector의 사용 3) vector의 생성자와 연산..

blockdmask.tistory.com

vector는 동적배열이라고도 한다. 일반적인 배열은 배열의 크기가 정해져 있지만, vector는 스스로 공간을 할당하고 크기를 확장하거나 축소시킬 수도 있다.

 

vector를 사용하려면 #include <vector>를 선언해준다. 즉, <vector> 헤더파일을 추가해야한다.

 

vector의 선언은 다음과 같다.

 -vector<[데이터 타입]> [변수의 이름]

vector<int> a;

 

vector의 기본적인 객체 선언

vector<int> v; // 비어있는 vector v를 생성
vector<int> v(5) // 기본값(0)으로 초기화 된 5개의 원소를 가지는 vector v를 생성
vector<int> v(5,2) // 2로 초기화 된 5개의 원소를 가지는 vector v를 생성
vector<int> v2(v1); // v2는 v1 vector를 복사해서 생성
//vector의 객체를 선언하고 내부에 인자가 있다고 할 때, 이들은 연산자로 대소비교가 가능하다

vector container는 내부적으로 공간을 관리하기 위해 다음과 같은 두 개의 변수를 사용한다.

 -size

 -capacity

 

size는 현재 백터에 보관되어 있는 원소의 갯수를 의미한다.

capacity는 벡터에 할당된 공간의 크기를 의미한다.

 

vector는 앞쪽이 막혀 있는 형태로 앞쪽에는 원소를 추가/제거할 수 없으며 뒤쪽에만 추가/제거할 수 있다.

 

vector의 멤버함수

//참조한다는 것은 해당 데이터를 리턴 한다는 뜻
vector<int> v; 

v.assign(5,2); // 2의 값으로 5개의 원소 할당.

v.at(idx); // idx번째 원소를 참조. v[idx]보다 속도는 느리지만, 범위를 점검하므로 안전함.

v[idx]; // idx번째 원소를 참조. 범위를 점검하지 않으므로 속도가 v.at[idx]보다 빠름.

v.front(); // 1번째 원소를 참조.

v.back(); // 마지막 원소를 참조.

v.clear(); // 모든 원소를 제거. 원소만 제거하고 메모리는 남아있음. size만 줄어들고 capacity는 그대로

v.push_back(7); // 마지막 원소 뒤에 원소 7을 삽입한다.

v.pop_back(); // 마지막 원소를 제거한다.

v.size(); // 원소의 갯수를 리턴한다.

v.capacity(); // 할당된 공간의 크기를 리턴한다.

v2.swap(v1); // v1과 v2의 원소와 capacity를 바꿔준다(모든걸 스왑).

v.insert(2,3); // 2번째 위치에 3의 값을 삽입한다. 삽입한 곳의 iterator를 반환.

v.empty(); // vector가 비었으면 return true
v.reserve(n) // n개의 원소를 저장할 공간을 예약한다.
v.resize(n,x) // v의 크기를 n으로 변경하고 확장되는 공간의 값을 기본값(0)으로 초기화한다.
v.resize(n,x) // v의 크기를 n으로 변경하고 확장되는 공간의 값을 x값으로 초기화한다.

 

멤버 형식으로 size_type은 index나 원소의 갯수등의 형식을 선언한다.

for (vector<int>::size_type i = 0; i < v.size(); ++i)   // 벡터의 size 타입으로 i를 지정한다 (unsigned int) 
        cout << v[i] << endl;

 

 

vector의 선언과 멤버함수를 활용한 예제이다.

#include <iostream>
#include <vector>
using namespace std;

int main(void){

  vector<int> v;
  v.reserve(8); // allocate memorie size to 8
  
  v.push_back(10);
  v.push_back(20);
  v.push_back(30);
  v.push_back(40);
  v.push_back(50);

  for(vector<int>::size_type i=0; i<v.size(); i++){
    cout<<v[i]<<endl;
  }
  cout<<endl;

  cout << "size : " << v.size(); //벡터 원소 갯수
  cout << " capacity : " << v.capacity(); //벡터할당메모리크기
  cout << " max_size : " << v.max_size(); //최대저장가능원소갯수

  cout << endl << " -- resize(10) -- " << endl;
  v.resize(10); // resize to 10, fill added space to 0

  for(vector<int>::size_type i =0; i<v.size(); i++){
    cout << v[i] << endl;
  }
  cout << endl;

  cout << "size : " << v.size(); //벡터 원소 갯수
  cout << " capacity : " << v.capacity(); //벡터할당메모리크기
  cout << " max_size : " << v.max_size(); //최대저장가능원소갯수
  
  cout << endl << " -- resize(3) -- " << endl;
  v.resize(3); // resize to 3

  for(vector<int>::size_type i =0; i<v.size(); i++){
    cout << v[i] <<endl;
  }
  cout << endl;

  cout << "size : " << v.size(); //벡터 원소 갯수
  cout << " capacity : " << v.capacity(); //벡터할당메모리크기
  cout << " max_size : " << v.max_size(); //최대저장가능원소갯수
  
  cout <<endl << " -- vector clear --"<< endl;
  v.clear();

  cout << "size : " << v.size(); //벡터 원소 갯수
  cout << " capacity : " << v.capacity(); //벡터할당메모리크기
  cout << " max_size : " << v.max_size(); //최대저장가능원소갯수
  
  cout << endl << " -- push_back -- " << endl;
  for(vector<int>::size_type i=1; i<=5; i++){
    v.push_back(i);
  }

  cout << endl;
  for(vector<int>::size_type i =0; i<v.size(); i++){
    cout << v.at(i) <<endl;
  }
  cout << endl;
  cout << "size : " << v.size(); //벡터 원소 갯수
  cout << " capacity : " << v.capacity(); //벡터할당메모리크기
  cout << " max_size : " << v.max_size(); //최대저장가능원소갯수
  
}



 

'c++ > STL' 카테고리의 다른 글

sort algorithm  (0) 2020.06.14