Programming Language/C,C++

C++] Vector를 이용한 이중 배열

TwinParadox 2017. 5. 1. 07:00
728x90

C++] Vector를 이용한 이중 배열



동적 할당에 대해서 익숙해지면

배열을 정적으로 할당하는 경우가 줄어들게 되고

거의 대부분 동적으로 할당하게 된다.

그렇지 않은 사람들도 있겠지만,

나는 변수 사이즈에 따라 배열 크기가 바뀌는 경우 반드시 동적할당을 통해서

배열의 크기를 결정 짓는다.


그러다가 STL의 vector라는 걸 알게 되면,

동적 할당도 잘 사용하지 않게 된다.

구조체가 필요하고 안에 들어가는 변수 관리가 까다로운 경우가 아니면,

거의 대부분의 경우 vector를 사용하게 된다.

물론, vector에 임의의 구조체를 넣지 못하는 건 아니고

그건 순전히 사용하는 나의 숙련도 문제에서 기인한 것이라고 생각된다.


Topcoder나 비정기적 혹은 정기적으로 개최되는 코딩 대회에 참가하거나,

그곳에서 나온 문제들을 풀게 되면 vector라는 걸 모르면,

안 되는 상황까지도 직면하게 되는 걸 감안하면,

초보적인 수준이라도 STL에 대해서 다룰 줄 아는 게 좋아보인다.


vector를 이용해 문제를 풀다가

vector의 특징은 살리되, 2차원 배열로 쓰고 싶어졌다.

대충 감은 오는데, 어떻게 해야 하는지 막막하기도 하고

이상한 오류도 발생하는데 거기에 대해서 오늘 좀 이야기를 해볼까 한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <vector>
using namespace std;
 
int main(void)
{
    int n;
    vector< vector<int> > arr;
 
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        vector<int> element(n);
        arr.push_back(element);
    }
 
    cout << arr.size() << endl;
    for (int i = 0; i < n; i++)
    {
        cout << arr[i].size() << ", ";
        for (int j = 0; j < n; j++)
        {
            arr[i][j] = n;
        }
    }
    cout << endl;
 
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
 
    for (int i = 0; i < n; i++)
    {
        arr[i].clear();
        cout << arr[i].size() << ",";
    }
    cout << endl;
 
    arr.clear();
    cout << arr.size() << endl;
 
    return 0;
}
cs



아주 간단하게 N 값을 입력 받고

vector를 이용하여 N*N의 이중 배열을 만들어

값을 대입하여 출력한 후 그것들을 다시 제거해주는 과정을 보여주고 있다.



1
2
3
4
5
6
7
vector< vector<int> > arr;
 
for (int i = 0; i < n; i++)
{
    vector<int> element(n);
    arr.push_back(element);
}
cs



그냥 예상했던 대로 vector안에 vector를 넣어주면 배열처럼 쓸 수 있다.

다만, vector 선언 과정에서 '>'이 겹쳐서 쉬프트 연산자로 인식하게 되니

띄어쓰기로 구분을 해주어야 한다는 점에 유념하도록 하자.


접근하는 방식도 배열처럼 할 수 있어서 변수 접근은 매우 쉽다.

유념해야하는 점은 생성된 벡터 크기 이상에 바로 접근하여 변수를 넣는 작업은 불가능하고

push_back() 등을 이용해야 한다는 점을 유념해야 한다.



신나게 이걸 써먹고,

이제 이 변수들이 더 이상 쓸모 없게 되는 경우

동적할당한 경우에는 free, delete 등의 명령으로 메모리를 해제해주는데,

vector에서는 어떻게 해주어야 할까?


1
2
3
4
5
for (int i = 0; i < n; i++)
{
    arr[i].clear();
}
arr.clear();
cs



그냥 동적할당한 배열을 해제해줄 때와 비슷한 방식으로 진행하면 된다.

clear()라는 함수로 싹 비워주기만 하면,

변수 형체만 남고 그 내용물들은 다 정리된다.


꽤나 편리한 vector를 잘만 사용하면,

우리가 원하는 크기가 자유자재로 변하는 이중배열을

그리 어렵지 않은 방법으로 쉽게 접근할 수 있다.

이런 것들을 접할 때마다 응용에 대해서 다시 한 번 깨닫게 된다.

728x90