vector를 요소로 갖는 벡터를 선언하여 2-dim array를 구현 가능. 이 경우, 각각의 row는 별도의 vector 이므로, n x n 으로 딱 떨어지는 행렬 뿐 아니라 row마다 서로 다른 크기의 column을 가지게 하는 것도 가능.
예제
#include <iostream> | |
#include <vector> | |
#include <iomanip> | |
void print(const std::vector<std::vector<int>>& vec); | |
int main() | |
{ | |
// ======================== | |
// method1 | |
std::cout << "========================" << std::endl; | |
std::vector<std::vector<int>> vec1; | |
vec1.push_back(std::vector<int>()); | |
vec1.push_back(std::vector<int>()); | |
for (int i = 0; i < 3; ++i) | |
vec1[0].push_back(i); | |
for (int i = 0; i < 3; ++i) | |
vec1[1].push_back(i+3); | |
print(vec1); | |
// ======================== | |
// method2 | |
std::cout << std::endl << "========================" << std::endl; | |
std::vector<std::vector<int>> vec2{ {1,2,3}, {4,5,6} }; // initializer | |
print(vec2); | |
// ======================== | |
// method2 | |
std::cout << std::endl << "========================" << std::endl; | |
std::vector<std::vector<int>> vec3(2, std::vector<int>(3)); // vec(row, std::vector<int>(col)) | |
print(vec3); | |
return 0; | |
} | |
void print(const std::vector<std::vector<int>>& vec) | |
{ | |
for (auto& r : vec) { | |
for (auto& c : r) | |
std::cout << std::setw(4) << c; | |
std::cout << std::endl; | |
} | |
return; | |
} |
단, method1 의 경우 column의 크기가 커지는 경우 vector 재할당이 발생해 효율이 떨어질 수 있음. 특히 새로운 row의 추가로 인한 vector 재할당은 단순히 그 row만 영향을 받는게 아니라 전체 row에 대해 재할당이 일어나기 때문에, 각 row 별로 vector 들이 전부 재할당 되어 더욱 심각한 비효율을 초래함.
결과
========================
0 1 2
3 4 5
========================
1 2 3
4 5 6
========================
0 0 0
0 0 0