일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 연결리스트
- vim-go
- go
- C++ gui
- c++ heap
- 운영체제
- C++ gui 라이브러리
- JUCE library
- BOJ
- JUCE라이브러리
- gui
- Nebula
- a tour of go
- 코딩
- JUCE
- C++ library
- 리듬게임
- LOB
- tour of go
- C++
- 알고리즘
- 공룡책
- 프로그래밍
- go channel
- Docker
- 자료구조
- C언어
- 백준
- JUCE 튜토리얼
- OS
Archives
- Today
- Total
CafeM0ca
[C++]2차원 vector 본문
반응형
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