CafeM0ca

[C++]2차원 vector 본문

Programming/C++

[C++]2차원 vector

M0ca 2019. 1. 1. 14:21
반응형

std::vector는 많은 C++ 프로그래머들에게 사랑받는 컨테이너다.

배열은 정적이라 컴파일타임에 이미 메모리 공간에 자리잡고 있어서 인덱스 범위 안에만 있다면 접근이 가능하지만

벡터는 동적이라 컴파일타임에 메모리가 자리잡고 있지 않다. 


간간히 2차원 벡터가 필요할 경우가 있다.

이 글에서는 간단하게 설명하고자 한다.


벡터의 기본 선언은 다음과 같다.


std::vector<자료형> v;


std::vector도 하나의 클래스로써 자료형으로 취급된다. 따라서 다음과 같은 선언이 허용된다.


std::vector<std::vector<자료형>> dv;


위 선언을 통해 간단하게 2차원 벡터를 만들었다. 그러나 여기서 끝나면 포스팅 안했다. 서론에서 말했듯이 벡터는 동적이므로 위와같이 선언한 후 인덱스에 접근하면 out_of_range 에러 메시지를 볼 수 있다.


2차원 배열을 입력받는 코드를 작성하면 다음과 같다.


1
2
3
4
5
6
7
8
 char darr[8][8];
 for(int i=0; i<n; i++){
      char ch;
      for(int j=0; j<m; j++){
          cin >> ch;
          darr[i][j] = ch;
      }
 }
cs

darr[i][j]에 ch를 대입하기 전에 뭔지는 몰라도 메모리가 존재한다. 그리고 그 값은 쓰레기값이다.


2차원 벡터는 어떨까?

1
2
3
4
5
6
7
8
9
10
vector<vector<char>> chessboard;
        cin >> n >> m;
        for(int col = 0; col<n; col++){
                char ch;
                chessboard.push_back(vector<char>());
                for(int row = 0; row<m; row++){
                        cin >> ch;
                        chessboard.at(col).push_back(ch);
                }
        }
cs

행마다 값을 추가하기 전에 새로운 벡터를 만들어서 메모리가 존재하게끔 처리해줘야 에러가 없다.

2차원 벡터도 배열처럼 인덱스 접근이 가능한데 인덱스가 보장되지 않는다면 내장함수인 at을 애용하자.


출력은 다음과 같이 처리한다.


1
2
3
4
5
for(const auto& i : chessboard){
    for(const auto& j : i)
         cout << j << " ";
    cout << endl;
}
cs


반응형

'Programming > C++' 카테고리의 다른 글

[EOS]EOS Tool 설명  (0) 2018.10.14
[EOS] eosio.cdt build sys error  (0) 2018.10.12
[C++11] 조건변수  (0) 2018.09.16
[C++] std::call_once, std::once_flag  (0) 2018.09.16
[C++] explicit  (0) 2018.07.23
Comments