2022년 1월 2일 일요일

STL, vector

1. Vector 정의

길이가 변하는 동적 배열로서 객체를 삽입하거나 제거할 때 자동으로 크기가 변한다. 배열 대용으로 사용가능하다.


2. Vector 사용법

#include <vector>

vector <변수 형태> 변수이름

at : 원소에 아이템 접근 읽기 쓰기 가능, 영역 벗어나는지 검사 가능

operator[] : 원소에 아이템 접근 읽기 쓰기 가능


3. 메소드 종류

size() : 저장된 item 갯수 획득

reserve() : 스토리지를 미리 예약한다, 메모리 할당이 한번에 많이 할때 성능을 위해서 사용을 고려가 필요하다.

capacity() : 현재 할당할 수 있는 메모리, 이 양보다 증가되면 신규로 메모리 할당이 일어난다.

clear() : 전체 아이템 삭제

insert() : 특정 위치에 아이템 추가

push_back() : 아이템을 뒤쪽에 추가

erase(iterator) : 아이템 삭제

pop_back() : 마지막 아이템 삭제


전체 목록은 아래 참고

https://en.cppreference.com/w/cpp/container/vector


4. 예제

4.1 아이템 추가 / 접근

단순한 예제입니다. push_back()으로 마지막에 아이템을 추가하고 at() 이나 [] 연산자로 접근이 가능합니다.

#include <iostream>
#include <vector>

using namespace std;

int test1()
{
    vector <int> v;

    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.at(0) = 40;
    v[1] = 50;

    int nsize = v.size();
    cout << "size:" << nsize << endl;
    cout << "v = { ";
    for (int i=0 ; i < nsize ; i++) {
        cout << v[i] << ", ";
    }
    cout << "};" << endl;
    return 0;
}
int main()
{
    test1();
    return 0;
}

출력

size:3
v = { 40, 50, 30, };


4.2 at / operator[] 차이 및 주의점

at / []의 가장큰 차이점은 at은 boundary 검사를 한다는것입니다. 당연히 속도가 떨어질 가능성이 있겠죠. []은 검사를 하지 않지만 메모리를 잘못 액세스시 어떤일이 벌어질지 그때 그때마다 동작이 다르게 됩니다.

아래 예제를 보면 v[3] = 50; 를 사용하지만 v.size()그대로 3을 유지하고 있습니다. 즉 [] 연산자에 의해서 크기는 전혀 증가가 되지 않습니다. at은 범위를 벗어나면 exception을 일으킵니다.

#include <iostream>
#include <vector>

using namespace std;

int test2()
{
    vector <int> v;

    v.push_back(10); // index 0
    v.push_back(20); // index 1
    v.push_back(30); // index 2
    cout << "vsize:" << v.size() << endl;
    v[3] = 50;
    cout << "vsize:" << v.size() << " v[3]:" << v[3] << endl;
    v.at(3) = 40;
    cout << "vsize:" << v.size() << " v[3]:" << v[3] << endl;

    int nsize = v.size();
    cout << "size:" << nsize << endl;
    cout << "v = { ";
    for (int i=0 ; i < nsize ; i++) {
        cout << v[i] << ", ";
    }
    cout << "};" << endl;
    return 0;
}
int main()
{
    test2();
    return 0;
}

결과

vsize:3
vsize:3 v[3]:50
terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check: __n (which is 3) >= this->size() (which is 3)


댓글 없음:

댓글 쓰기