我有以下类型:
std::vector<std::vector<int>> indicies
内部向量的大小始终为2。问题在于,向量在内存中是非连续的。我希望用连续的东西替换内部向量,以便我可以将压平的数组强制转换:
int *array_a = (int *) &(a[0][0])
如果新类型有[]运算符,那就太好了,这样我就不必改变整个代码了。(如果必要的话),我有以下两种想法:
std::vector<std::array<int, 2>>
或者std::vector<std::pair<int, int>>
这些在内存中是什么样子?我写了一个小测试:
#include <iostream>
#include <array>
#include <vector>
int main(int argc, char *argv[])
{
using namespace std;
vector<array<int, 2>> a(100);
cout << sizeof(array<int, 2>) << endl;
for(auto i = 0; i < 10; i++){
for(auto j = 0; j < 2; j++){
cout << "a[" << i << "][" << j << "] "
<<&(a[i][j]) << endl;
}
}
return 0;
}
这会导致:
8
a[0][0] 0x1b72c20
a[0][1] 0x1b72c24
a[1][0] 0x1b72c28
a[1][1] 0x1b72c2c
a[2][0] 0x1b72c30
a[2][1] 0x1b72c34
a[3][0] 0x1b72c38
a[3][1] 0x1b72c3c
a[4][0] 0x1b72c40
a[4][1] 0x1b72c44
a[5][0] 0x1b72c48
a[5][1] 0x1b72c4c
a[6][0] 0x1b72c50
a[6][1] 0x1b72c54
a[7][0] 0x1b72c58
a[7][1] 0x1b72c5c
a[8][0] 0x1b72c60
a[8][1] 0x1b72c64
a[9][0] 0x1b72c68
a[9][1] 0x1b72c6c
在这种情况下似乎可以工作。这种行为是标准行为还是仅仅是幸运的巧合?有更好的方法来做到这一点吗?
std::pairs
和std::arrays
是否可能存在填充?仅仅因为std::vector
的元素是连续存储的并不足够。 - Wintermute