C++ Vector

Polynomeer·2020년 4월 29일
0

C++

목록 보기
1/1
post-custom-banner

C++ Vector

벡터는 프로그램이 실행되는 동안에도 길이가 자라거나 줄어들 수 있는 배열(가변배열) 이라고 볼 수 있다. 배열과 마찬가지로 기본 자료형은 가지고, 그 타입의 데이터 모음을 저장한다. 사용 방법에 있어서 배열과 다른점은 크게 두 가지 밖에 없다. 먼저, 벡터 타입에 대한 문법, 그리고 선언를 하는 방식이다.

벡터로 int형의 선언은 vector<int> v 와 같이 한다. vector<Base_Type> 라는 표기방식은 템플릿 클래스이다. 즉, <Base_Type>의 자리에 어떠한 타입의 데이터를 넣을 수도 있다는 말이다. 간단히 예를 들면, vector<string> v, vector<stack> v 와 같은 형태로 활용가능하다는 뜻이다.

Vector를 선언하는 방법

벡터를 선언하는 방법은 여러 가지 형태가 있을 수 있는데, 가장 기본적인 형태는 vector<Base_Type> v이다. 이 경우에는 크기가 0인 벡터를 선언만 하는 형태이므로 따로 공간을 할당해주거나, 데이터를 push_back()함수를 통해서 추가해주어야 한다.

vector<int> v;
push_back(1);
push_back(2);
push_back(3);
v[0]v[1]v[2]
123

두 번째 방법으로, 선언과 동시에 벡터의 크기를 지정할 수 있다. 이때는 벡터에 해당 크기만큼의 빈 공간이 할당된다. 따로 초기화 해주지 않아도 기본값은 0으로 초기화 된다.

vector<int> v(3); // int v[3]; 과 동일
v[0]v[1]v[2]
000

알고리즘 문제 풀이를 하면서 이 방법을 주로 사용하는 경우가 많다. 왜냐하면 문제에서 보통 N이 주어지고 그만큼의 입력을 받는 형태가 많기 때문이다.

int N;
cin >> N;
vector<int> v(N);

◼︎ PITFALL: Using square brackets in definition

벡터의 선언에서 [] 기호를 사용하는 것은 어떤 의미를 가질까? 처음에 이 부분이 약간 헷갈려서 실수를 한적이 있다. vector v(n)과 같이 선언하면 크기가 n인 벡터를 선언한 것이다. 하지만 vector v[n]으로 선언하면 int형 벡터를 n개 만큼 선언한 것이다.

 vector<int> v1(3); // 크기가 3인 벡터 선언
 vector<int> v2[3]; // 벡터를 3개 선언
 for(int i=0; i<v1.size(); i++) // 정상 출력
     cout << v1[i];
 for(int i=0; i<v2.size(); i++) // 에러 발생
     cout << v2[i];
v[0]v[1]v[2]
000

이것은 vector<int> v(3); 으로 선언했을 때의 초기 모습이다.

v[0]v[1]v[2]
vector<int>vector<int>vector<int>

반면에, vector<int> v[3]; 으로 선언하면 vector의 레퍼런스(참조값)를 담고있다.

✓ 그래프의 인접리스트 표현에서도 이런 방식이 사용된다.

참고자료: https://stackoverflow.com/questions/26073735/square-brackets-in-vectors

Square Brackets []

벡터는 배열과 마찬가지로 []를 사용하여 해당 인덱스에 접근할 수 있다. 배열과 마찬가지로 인덱스는 0부터 시작한다. 단, 배열과 다르게 할당되지 않은 영역에 접근할 수 없다.

◼︎ PITFALL: Using square brackets beyond the vector size

만약 v가 벡터이고 i 가 v.size()보다 크거나 같다면, v[i] 원소는 아직 존재하지 않으며, push_back 메소드를 통해 i를 포함한 영역을 만들어줄 필요가 있다. 이때 v.size()보다 크거나 같은 i에 대해서 v[i]의 값을 변경하려고 한다면, 에러메시지는 발생하지 않으나, 프로그램이 특정 지점에서 예상치 못하게 실행될 수 있다.

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

int main(){
    vector<int> v;
    cout << "Enter a list of positive numbers.\n"
         << "Place a negative number at the end.\n";
    int next;
    cin >> next;
    while (next > 0) {
        v.push_back(next);
        cout << next << " added. ";
        cout << "v.size() = " << v.size() << endl;
        cin >> next;
    }
    cout << "You entered:\n";
    for(unsigned int i = 0; i < v.size(); i++)
        cout << v[i] << " ";
    cout << endl;
    
    return 0;
}
[실행 결과]
Enter a list of positive numbers.
Place a negative number at the end.
2 4 6 8 -1 // 입력 
2 added. v.size() = 1
4 added. v.size() = 2
6 added. v.size() = 3
8 added. v.size() = 4
You entered:
2 4 6 8 
profile
어려운 문제를 어렵지 않게.
post-custom-banner

0개의 댓글