Для хранения изображений, которые могут быть более двухмерными, я использую класс, имеющий элементы данных
std::vector <size_t> sizes; // dimensions of the images
std::vector <size_t> strides; // strides to walk through the data
std::vector <double> *data; // data points stored as 1-dimensional
, а для получения и установки значений отдельных точек у меня есть эти функции
// operator[] for positional addressing
double const* operator[] ( std::initializer_list < size_t > const& indices ) const {
size_t const offset =
std::inner_product ( indices.begin(), indices.end(),
strides.begin(),
0 );
return & ( (*data) [ offset ] );
}
double* operator[] ( std::initializer_list < size_t > const& indices ) {
size_t const offset =
std::inner_product ( indices.begin(), indices.end(),
strides.begin(),
0 );
return & ( (*data) [ offset ] );
}
Я могу использовать эти функции, чтобы получить данные в указанных местах и распечатать их, например, , используя std::cout << my_image[{1,2,3}]
для 3D-изображения, но когда я хочу их установить, например используя my_image[{1,2,3}] = 10.;
, тогда я получаю ошибку lvalue required as left operand as assignment
. Я последовал совету ean более раннего поста , передав указатели от оператора []
(который сам по значению), один const и один non-const. Разве нельзя установить элементы изображения с таким синтаксисом?