본문 바로가기
Programming/C++

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

by 임아톰 2022. 7. 14.

1. vector란?

  • 어떠한 자료형도 넣을 수 있는 동적 배열
  • vector에 저장된 요소는 연속된 메모리 공간에 위치
  • 요소 수가 증가함에 따라 메모리를 자동으로 관리
  • 어떤 요소에도 임의 접근이 가능

 

2. vector 헤더파일 및 네임스페이스

  • #include <vector>
  • using namespace std;

 

3. vector 만들기

vector<int> v;

  • 빈 벡터를 생성

 

vector<int> v(5);

  • 크기가 5이고, 모든 요소가 기본값인 0으로 초기화된 벡터 생성

 

vector<int> v(5, 10);

  • 크기가 5이고, 모든 요소가 10으로 초기화된 벡터 생성

 

vector<int> v2(v1);

  • v1 vector와 동일한 크기 및 데이터를 갖는 vector v2 생성

 

예시)

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

int main() {
    // 크기가 0인 벡터 선언
    vector<int> vec1;

    // 지정한 값으로 이루어진 크기가 5인 벡터 선언
    vector<int> vec2 = { 1, 2, 3, 4, 5 };

    // 기본값 0으로 초기화된 크기 5인 벡터 선언
    vector<int> vec3(5);

    // 크기가 10이고, 모든 원소가 5로 초기화된 벡터 선언
    vector<int> vec4(10, 5);

    return 0;
}

 

4. vector 멤버 함수

 

vector의 마지막 요소 추가/제거

v.push_back(7);

  • vector의 마지막에 7을 추가

v.pop_back();

  • vector의 마지막 요소 제거

 

예시)

vector<int> vec;  // 빈 벡터 생성
vec.reserve(3)

vec.push_back(1);  // 벡터의 뒤에 1 추가 {1}

vec.push_back(2);  // 벡터의 뒤에 2 추가 {1, 2}

vec.push_back(3);  // 벡터의 뒤에 2 추가 {1, 2, 3}

vec.pop_back(); // 맨 마지막 원소 제거 {1, 2}

 

vector의 용량, 크기

v.capacity();

  • vector에 할당된 공간 수

v.size();

  • vector에 실제로 들어 있는 요소 수

v.reserve(10);

  • vector의 용량을 10만큼 늘림
  • 용량을 늘림으로서 불필요한 메모리 재할당을 막을 수 있음

v.clear();

  • vector의 모든 요소 제거
  • 크기(size)는 0이 되고 용량(capacity)은 그대로

 

예시) 사이즈를 이용한 모든 요소 출력

#include <iostream>
#include <vector>

using namespace std;
int main()
{
	std::vector<int> vec = { 0, 1, 2, 3, 4, 5};

	for (int i = 0; i < vec.size(); ++i)
	{
		cout << vec[i] << " ";
	}
	return 0;
}

 

vector 요소 접근

v[idx];

  • idx 번째 원소를 참조

 

반복자(iterator)

v.begin()

  • vector의 첫 번째 요소를 가리키는 반복자 반환

v.end()

  • vector의 마지막 요소의 다음 요소를 가리키는 반복자 반환

v.rbegin()

  • vector의 마지막 요소를 가리키는 역방향 반복자를 반환

v.rend()

  • vector의 첫 번째 요소의 앞 요소를 가리키는 역방향 반복자를 반환

 

예시) 반복자를 이용하여 모든 요소 출력

#include <iostream>
#include <vector>

using namespace std;
int main()
{
	std::vector<int> vec = { 0, 1, 2, 3, 4, 5};
	vec.insert(vec.begin(), -1);

	for (auto& v : vec)
	{
		cout << v << " ";
	}

	for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); ++iter)
	{
		cout << *iter << " ";
	}
	return 0;
}

 

특정 위치 요소 삽입/삭제

std::vector<int> vec = {1, 2, 3, 4, 5};

vec.insert(vec.begin(), 0); // 벡터 맨 앞에 0 추가 {0, 1, 2, 3, 4, 5}

vec.erase(vec.end() - 1); // 맨 마지막 요소 제거 {0, 1, 2, 3, 4}

vec.erase(vec.begin() + 2, vec.end()); // 2번 째 원소부터 마지막 원소까지 제거 {0, 1}

 

5. vector 정렬(sort), 값 찾기(find)

정렬

sort(vec.begin(), vec.end());

  • vector를 오름 차순 정렬

 

정렬 예시)

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

int main() {
    vector<int> vec = { 3, 1, 4, 2, 7, 6, 5 };

    sort(vec.begin(), vec.end()); // 오름 차순 정렬 {1, 2, 3, 4, 5, 6, 7}
    for (auto v : vec)
        cout << v << " ";

    return 0;
}

 

내림차순 정렬

vector<int> vec = { 3, 1, 4, 2, 7, 6, 5 };
sort(vec.begin(), vec.end(), greater<int>()); // 내림 차순 정렬 {7, 6, 5, 4, 3, 2, 1}

 

값 탐색

find(v.begin(), v.end(), 3)

  • vector에서 요소의 값이 3인 요소 위치의 반복자 반환
  • vector의 범위에 찾을 대상이 없는 경우 마지막 반복자인 v.end()를 반환

 

예시)

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

int main() {
    vector<int> vec = { 3, 5, 6, 8 };

    if (find(vec.begin(), vec.end(), 7) == vec.end())
    {
        cout << "not exist" << endl;
    }

    auto it = find(vec.begin(), vec.end(), 6);
    if (it != vec.end())
    {
        vec.erase(it);
    }
    
    for (auto v : vec)
        cout << v << " ";

    return 0;
}
반응형