很明显,二维数组的行主要形式是存储的单个数组,以使不同的行按顺序对齐。
要遍历2d数组的任何元素,我总是可以做到的:
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
for(int i=0;i<3*3;i++){
cout<<*(*a+i)<<" "; //row major form concept where i<m*n;
}
给予:
1 2 3 4 5 6 7 8 9
它完全适合我,但是每当我使用矢量执行此操作时,都会抛出错误:
vector<vector<int> > v={{1,2,3},{4,5,6},{7,8,9}};
int m=v.size();
int n=v[0].size();
for(int i=0;i<m*n;i++){
cout<<*(*v+i)<<" ";
}
它给出了:
no match for ‘operator*’ (operand type is ‘std::vector<std::vector<int> >)
我希望向量确实遵循行主要形式的概念,即数组。如果是,那么在向量情况下行专业的替代方案是什么?
答案 0 :(得分:13)
您走错了路。由于std::vector
在免费存储区上动态分配内存,因此不存在行大或列大的情况。
从int foo[][]{ { 1, 2, 3 }, { 4, 5, 6 } }
开始的二维数组&foo[0]
的内存:
1, 2, 3, 4, 5, 6
可视化:
+------+
| foo |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
+------+
std::vector<std::vector<int>> foo{ { 1, 2, 3 }, { 4, 5, 6 } }
的内存:
某处(与&foo
无关):
1, 2, 3
其他地方:
4, 5, 6
可视化:
+------+
+--> | int |
+-------------------------+ | +------|
| foo | | | 1 |
+-------------------------+ +------------------+ | | 2 |
| std::vector<int> *data -|-----> | std::vector<int> | | | 3 |
+-------------------------+ +------------------+ | +------+
| int* data[0]-----|--+
| int* data[1]-----|--+ +------+
+------------------+ +--> | int |
+------+
| 4 |
| 5 |
| 6 |
+------+
要遍历std::vector
个中的std::vector
:
for (auto const &v_item : v) {
for (auto const &i : v_item) {
std::cout << i << ' ';
}
}
std::cout.put('\n');