很明显,二维数组的行主要形式是存储的单个数组,不同的行按顺序对齐。
要遍历二维数组的任何元素,我总是可以这样做:
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<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> >)
我希望 vector 确实遵循作为数组的行主要形式概念。如果是,那么在 vector 的情况下行专业的替代方案是什么?
最佳答案
你走错路了。自 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');
关于c++ - vector 是否存在行主要形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52738900/