본문 바로가기

IT/Programming Language

[C++/STL] STL 사용법 : Container - Vector

반응형

vector

std::vector는 C++의 표준 템플릿 라이브러리(STL)에서 제공하는 동적 배열 컨테이너입니다.

 

1. 특징

  1. Dynamic Size: std::vector는 동적으로 크기를 조절할 수 있는 배열입니다. 요소를 추가하거나 삭제할 수 있습니다.
  2. 연속된 메모리: 내부적으로 연속된 메모리 블록에 요소를 저장하며, C 스타일 배열과 유사한 성능을 제공합니다.
  3. 자동 메모리 관리: 벡터는 자체적으로 메모리를 관리하며, 더 이상 사용하지 않을 경우 메모리를 자동으로 해제합니다.
  4. 빠른 접근: 인덱스를 통해 O(1) 시간 복잡도로 요소에 접근할 수 있습니다.
  5. 유연성: 다양한 데이터 타입을 사용할 수 있으며, 다양한 STL 알고리즘과 통합할 수 있습니다.

 

선언

#include <vector>
std::vector<int> vec;

// example
std::vector< int > vec = {1,2,3,4,5}; // 크기가 5인 벡터, 초기값 등록
std::vector< int > vec(10);           // 크기가 10인 벡터, 원소는 모두 기본값(0)으로 초기화
std::vector< int > vec(10,5);         // 크기가 10인 벡터, 원소는 모두 5로 초기화

함수

Iterators

함수 설명
begin() 첫번째 원소를 가리키는 iterator를 반환
end() 마지막 원소의 다음을 가리키는 iterator를 반환
cbegin() 첫번째 원소를 가리키는 상수 iterator를 반환
cend() 마지막 원소의 다음을 가리키는 상수 iterator를 반환
rbegin() 역 순차열의 첫 번째 원소를 가리키는 iterator를 반환
rend() 역 순차열의 마지막 원소의 다음을 가리키는 iterator를 반환
crbegin() 역 순차열의 첫 번째 원소를 가리키는 상수 iterator를 반환
crend() 역 순차열의 마지막 원소의 다음을 가리키는 상수 iterator를 반환

 

기타 접근 또는 사용 관련

함수 설명
front() 첫번째 원소의 값
back() 마지막 원소의 값
at(int N) N번째 원소 값
[] 연산자 인덱스를 통한 값 접근 허용
empty() 비어있다면 true, 아니라면 false 반환
size() 크기 반환
capacity() 벡터가 할당된 메모리의 크기를 반환 (size보다 항상 크거나 같음)
push_back(T value) 맨 마지막 원소 추가
pop_back() 맨 마지막 원소 삭제
insert(iterator it, T value) 원하는 위치에 원하는 값 삽입
erase(iterator it1, [iterator it2]) 원하는 위치, 범위의 원소 삭제
clear() 벡터 초기화(길이 = 0)
resize(n) 크기를 n으로 변경 (늘어난 위치의 원소들은 기본값으로 초기화)
reserve(n) capacity를 n으로 변경 (기존 크기보다 작으면 무시)

 

사용 예시

#include <iostream>
#include <vector>

using namespace std;

int main() {
    // 선언
    vector<int> arr1 = { 1,2,3,4,5 };
    vector<int> arr2(5);
    vector<int> arr3(5, 10);

    // push_back
    arr1.push_back(6);
    cout << arr1.back() << endl;        // 6

    // pop_back
    arr1.pop_back();
    cout << arr1.back() << endl;        // 5

    // insert
    arr1.insert(arr1.begin(), 0);
    cout << arr1.front() << endl;       // 0

    arr2.insert(arr2.begin() + 1, 2);
    cout << arr2.at(1) << endl;         // 2

    // erase
    arr2.erase(arr2.begin() + 1);
    for (auto it = arr2.begin(); it != arr2.end(); it++)    // 0, 0, 0, 0, 0,
        cout << *it << ", ";
    cout << endl;

    arr1.erase(arr1.begin(), arr1.begin() + 2);
    for (auto it = arr1.begin(); it != arr1.end(); it++)    // 2, 3, 4, 5,
        cout << *it << ", ";
    cout << endl;

    // clear
    arr3.clear();
    cout << arr3.size() << endl;    // 0

    // resize
    arr1.resize(10);
    for (auto it = arr1.begin(); it != arr1.end(); it++)    // 2, 3, 4, 5, 0, 0, 0, 0, 0, 0,
        cout << *it << ", ";
    cout << endl;

    arr1.resize(2);
    for (auto it = arr1.begin(); it != arr1.end(); it++)    // 2, 3,
        cout << *it << ", ";
    cout << endl;
}

 

 

반응형