У меня есть следующий вид:Заменить вектор вектора с плоской структурой памяти
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
Это, кажется, работает в этом случае. Это поведение в стандарте или просто удачное совпадение? Есть лучший способ сделать это?
[Элементы вектора хранятся смежно] (http://stackoverflow.com/q/849168/238902) – Default
Я думаю, что вопрос: Может ли быть заполнение в 'std :: pairs' и' std: : arrays'? Просто, что 'std :: vector' сохраняет свои элементы смежно, здесь недостаточно. – Wintermute
Вектор векторов ** не гарантированно сохраняет элементы смежно **. Только объекты (внутренние векторы как адреса или любое другое представление используются) хранятся смежно, но не данные, на которые указывает каждый отдельный указатель данных внутреннего вектора. – vsoftco