본문 바로가기
C++

[C++] - vector를 2차원으로 사용하기 (STL)

by 개발 고양이 2024. 1. 8.

vector는 동적으로 메모리를 할당한 배열이다. 기존 1차원 vector를 값을 초기화하여 선언하는 방법은 다음과 같았다.

vector <데이터 타입이름 (크기초기값) ;     ex) vector<int> v;

 

2차원 vector를 선언하려면, vector의 데이터 타입에 vector를 또 담는다고 생각하면 된다. 

vector<vector<int>>v;

벡터의 자료형에 또 다른 벡터가 들어간다.

2차원 벡터는 2차원 배열과 같이 대괄호를 이용한 v[i][j]로 각 원소에 접근이 가능하다.


1. 행이 m개, 열이 n개인 2차원 벡터를 0으로 초기화하여 선언

vector <vector<int>> v(m, vector<int>(n,0));

벡터 v는 m개의 원소를 가지고 있으며, 이 m개의 원소들은 각각 n개의 원소를 0으로 초기화한 벡터를 담고 있다.

 

int m, n;
cin >> m >> n;

//m*n인 2차원 벡터를 0으로 초기화하여 선언
vector <vector<int>> v(m, vector<int>(n, 0));

for (int i = 0; i < m; i++) {
	for (int j = 0; j < n; j++) {
		cout << v[i][j] << " ";
	}
	cout << "\n";
}

 

위 방법은 벡터를 선언함과 동시에 메모리도 지정한 만큼 할당했기 때문에, 위와 같은 방법으로 선언한 2차원 벡터는 따로 삽입 연산을 수행할 필요 없이, 범위(m*n) 내의 원소라면 아무 곳이나 v[i][j] 로 접근이 가능하다.


2. 각 행마다 열의 개수가 다를 때, m개의 행만 선언

//벡터를 자료형으로 가지고 있는 m 길이의 벡터 v를 선언
vector<vector<int>> v(m);

v[0].push_back(1);
v[0].push_back(2);
v[0].push_back(3);

v[1].push_back(10);

v[2].push_back(100);
v[2].push_back(200);

v[3].push_back(0);

 

 

위와 같이 원하는 행만큼한 벡터를 선언하고, 각 행마다 삽입 연산(push, insert 등)을 통하여 원하는 만큼 데이터를 삽입하는 것도 가능하다. (0행, 1행, 2행에 각각 다른 개수의 원소를 삽입할 수 있는 것이다.)

단, 원소를 삽입하기 전에는 v[i][j]를 이용하여 원소에 접근을 할 수 없다. 행 벡터만 선언된 것이고 각 행의 열 벡터는 아무 값도 들어있지 않기 때문이다.