더듬이의 헬로월드

Hello, World!

프로그래밍 언어/C++ [STL]

[C++STL]Vector, 벡터 컨테이너 사용법(가변 배열)

더듬이 2021. 9. 23. 19:15
728x90

가변 배열

https://ddecode.tistory.com/entry/C%EA%B8%B0%EB%B3%B8-27%EA%B0%80%EB%B3%80-%EB%B0%B0%EC%97%B4

위 포스팅에 기존 배열의 문제점을 설명하고, 가변 배열의 구현을 해보았다.

굳이 우리가 직접 만들지 않아도 이는 Vector라는 이름으로 STL에 구현되어있다.


vector는?

벡터는, 힙 메모리 공간에 생성되는 동적 할당되는 배열이다.

기존 배열보다 효율적으로 메모리를 관리하는 것이 가능하다!

삭제의 경우에도 지원하지만, 맨 끝을 삭제하는 것이 아닌 이상,

삭제할때마다 삭제하는 원소 기준 뒷부분이 앞으로 이동하기에, 삭제가

자주 일어나는 상황에서는 속도가 느려질 수 있다.(연결 리스트를 사용하면 좋다!)


vector의 헤더파일

#include <vector>

이 헤더를 통해 vector를 사용할 수 있다.


vector의 선언, 초기화

vector<int> myvector;

-비어있는 vector myvector를 생성한다!

vector<int> myvector(5);

-크기가 5인 myvector를 생성한다!

vector<int> myvector(10,6);

-크기가 10이며, 6으로 초기화 된 myvector를 생성한다

vector<int> myvector = {5,6,7};

-크기 3의 5,6,7이 들어가있는 myvector를 생성한다.

vector<int> myvector(yourvector);

-yourvector를 복사한 myvector를 생성한다.

vector<vector<int>> myvector;

-2차원 배열의 형태인 myvector를 생성한다.


vector의 반복자

myvector.begin()

-myvector의 시작, 첫번쨰 주소를 반환한다.

myvector.end()

-myvector의 마지막 원소의 다음 주소를 반환한다!

-begin()과 달리, 끝주소 +1의 값의 형태이다! 이점 주의

vector<int> myvector = {1,2,3,4,5,6,7,8,9,10};
    for (auto i = myvector.begin(); i != myvector.end(); i++)
        cout << *i << endl;

즉, 이런 코드를 통해 전체 원소를 출력할 수 있다!


vector의 삽입, 삭제는?

push_back()

myvector.push_back(10);

-myvector의 마지막 부분에 10을 삽입한다!

pop_back()

myvector.pop_back();

-myvector의 마지막 원소를 삭제한다.

이 경우, 데이터 마지막 원소를 삭제한 것이므로 삭제후 특별한 데이터 연산이 이루어지지 않는다.

insert()

myvector.insert(myvector.begin()+1, 6);

-벡터의 중간에 값을 입력하고 싶을 때 사용하는 방법이다.

-첫번쨰 인자로 넣을 위치, 두번쨰 인자로 넣을 데이터를 입력한다.

-데이터의 양이 많을 경우, 많은 데이터 이동이 발생하기 떄문에, 적합한 방법은 아니다.

myvector.insert(myvector.begin()+1, 6,5);
//myvector.begin()+1의 위치에, 5를 6번 넣는다.

3개의 인자를 받는 경우에는, 세번쨰 인자의 데이터를 , 두번째 인자만큼 넣는다.

erase()

    myvector.erase(myvector.begin() + 2);
    //myvector.begin() + 2 위치에 있는 데이터를 삭제한다.
    myvector.erase(myvector.begin(),myvector.begin()+5);
    //myvector.begin() 부터 myvector.begin()+5 까지의 데이터를 삭제한다.

-벡터의 중간을 삭제하고 싶을 때 사용한다.

-인자가 하나면 그위치의 데이터를, 두개면 그 사이의 모든 데이터를 삭제한다.

-insert와 마찬가지로, 많은 데이터 이동이 발생하기 떄문에, 비효율적일 수 있다.

clear()

myvector.clear()

-벡터 안의 모든 값을 삭제한다.


기타 함수

size()

myvector.size()

-벡터의 크기(원소 개수)를 반환합니다.

empty()

myvector.empty()

-벡터가 비어있는지 검사합니다.

-비어있다면 1, 아니면 0를 반환합니다.

front()

myvector.front()

-벡터의 맨 앞 원소를 반환합니다.

back()

myvector.back();

-벡터의 맨 뒤 원소를 반환합니다.


벡터의 각 요소 접근 하기

반복자와 역참조를 통해 접근하기

for (auto i = myvector.begin(); i != myvector.end(); ++i){
        cout << *i << endl;
    }

반복자는 myvector.begin()부터 시작하여, myvector.end()를 만날 떄까지 반복하고,

이를 역참조해가면서 출력한다.

배열처럼 접근하기

for (int i = 0; i < myvector.size();i++) {
        cout << myvector[i] << endl;
    }

크기를 반환해주는 size() 함수를 통해, 배열 원소를 접근하듯이 돌고 출력한다.

at()함수를 통해 접근하기

for (int i = 0; i < myvector.size();i++) {
        cout << myvector.at(i) << endl;
    }

at()함수는 해당 인덱스의 있는 닶을 반환해 주는 함수이다.

배열과 마찬가지인 형태라고 볼 수 있다.

728x90