Перебор по размерам наддува::multi_array
Я пытаюсь написать некоторый независимый от измерения код для шаблонного класса в C++, используя boost::multi_array (хотя, если другие контейнеры / структуры данных будут лучше в этом, я был бы рад услышать об этом).
Учитывая измерение, я хотел бы выполнить итерацию по всему диапазону любого другого измерения, возвращая 1-мерное представление вдоль выбранного измерения. Это довольно просто, или, по крайней мере, кажется, что это из документации буста.
Что я не могу понять, как это сделать, так это перебрать выбранное измерение по всем измерениям массива, когда измерение массива известно во время компиляции.
Любой совет, как это сделать?
1 ответ
Обычно вы можете сделать это с boost::multi_array, вот пример кода для создания 2D-представления 3D multi_array:
#include "boost/multi_array.hpp"
#include <cassert>
#include <iostream>
int main()
{
typedef boost::multi_array<double, 3> array_type;
typedef array_type::index index;
array_type myArray3D(boost::extents[3][4][2]);
// Assign values to the elements
int values = 0;
for (index i = 0; i != 3; ++i)
{
for (index j = 0; j != 4; ++j)
{
for (index k = 0; k != 2; ++k)
{
myArray3D[i][j][k] = values++;
}
}
}
// Verify values
int verify = 0;
for (index i = 0; i != 3; ++i)
{
for (index j = 0; j != 4; ++j)
{
for (index k = 0; k != 2; ++k)
{
std::cout << "[" << i << "]";
std::cout << "[" << j << "]";
std::cout << "[" << k << "] = ";
std::cout << myArray3D[i][j][k] << std::endl;
assert(myArray3D[i][j][k] == verify++);
}
}
}
typedef boost::multi_array_types::index_range range;
array_type::index_gen indices;
// Create a new view with 2 dimentions fixing the 2nd dimention to 1
array_type::array_view<2>::type myView =
myArray3D[indices[range()][1][range()]];
std::size_t numDims = myView.size();
std::cout << "numDims = " << numDims << std::endl;
for (index i = 0; i != 3; ++i)
{
for (index j = 0; j != 2; ++j)
{
std::cout << "[" << i << "]";
std::cout << "[" << j << "] = ";
std::cout << myView[i][j] << std::endl;
}
}
return 0;
}