Для этого массива:
vector<vector<int> > v;
v.push_back(vector<int>(0));
v.back().push_back(1);
v.back().push_back(2);
v.back().push_back(3);
v.back().push_back(4);
Я могу достаточно легко вывести {1, 2, 3, 4}:
cout << v[0][0] << endl;
cout << v[0][1] << endl;
cout << v[0][2] << endl;
cout << v[0][3] << endl;
Чтобы получить к нему доступ как к плоскому массиву, я могу сделать это:
int* z = (int*)&v[0].front();
cout << z[0] << endl;
cout << z[1] << endl;
cout << z[2] << endl;
cout << z[3] << endl;
Теперь, как мне получить доступ к многомерному вектору как к плоскому многомерному массиву? Я не могу использовать тот же формат, что и для доступа к одномерному вектору:
// This does not work (outputs garbage)
int** n = (int**)&v.front();
cout << n[0][0] << endl;
cout << n[0][1] << endl;
cout << n[0][2] << endl;
cout << n[0][3] << endl;
Обходной путь, который я нашел, заключается в следующем:
int** n = new int* [v.size()];
for (size_t i = 0; i < v.size(); i++) {
n[i] = &v.at(i).front();
}
cout << n[0][0] << endl;
cout << n[0][1] << endl;
cout << n[0][2] << endl;
cout << n[0][3] << endl;
Есть ли способ получить доступ ко всему многомерному вектору, такому как плоский массив c-стиля, без необходимости динамического выделения каждого измерения над данными перед доступом к ним?
Скорость не имеет решающего значения при реализации, а ясность для обслуживания имеет первостепенное значение. Многомерный вектор отлично подходит для хранения данных. Однако я также хочу предоставить данные в виде плоского массива в стиле c в SDK, чтобы к ним можно было легко получить доступ из других языков. Это означает, что выставлять векторы как объект STL нельзя.
Решение, которое я придумал, отлично подходит для моих нужд, поскольку я оцениваю массив только один раз в самом конце обработки, чтобы «сгладить» его. Однако есть ли лучший способ сделать это? Или я уже делаю это так, как только могу, без повторной реализации моей собственной структуры данных (излишнее, поскольку мой код сглаживания состоит всего из нескольких строк).
Спасибо за советы, друзья!
vector<int>
должен быть одинаковым? - person PiotrNycz   schedule 21.10.2012