У меня есть следующий тип:
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
В этом случае он работает. Это поведение в стандарте или просто удачное совпадение? Есть ли лучший способ сделать это?