А появилась ли возможность в новых версиях языка (до с++15 включительно) организовывать и работать с многомерным вектором, который бы хранил данные последовательно (как развертку многомерного массива в одномерный) в одном линейном буфере? [Чтобы быстро выполнять копирование, чтобы просто выполнять резервирование памяти, вычисление объема данных и т.п.]
Здравствуйте, _hum_, Вы писали:
__>А появилась ли возможность в новых версиях языка (до с++15 включительно) организовывать и работать с многомерным вектором, который бы хранил данные последовательно (как развертку многомерного массива в одномерный) в одном линейном буфере? [Чтобы быстро выполнять копирование, чтобы просто выполнять резервирование памяти, вычисление объема данных и т.п.]
Здравствуйте, σ, Вы писали:
__>>А появилась ли возможность в новых версиях языка (до с++15 включительно) организовывать и работать с многомерным вектором, который бы хранил данные последовательно (как развертку многомерного массива в одномерный) в одном линейном буфере? [Чтобы быстро выполнять копирование, чтобы просто выполнять резервирование памяти, вычисление объема данных и т.п.]
σ>valarray нужен, что ли? Он с C++98 есть.
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, σ, Вы писали:
__>>>А появилась ли возможность в новых версиях языка (до с++15 включительно) организовывать и работать с многомерным вектором, который бы хранил данные последовательно (как развертку многомерного массива в одномерный) в одном линейном буфере? [Чтобы быстро выполнять копирование, чтобы просто выполнять резервирование памяти, вычисление объема данных и т.п.]
σ>>valarray нужен, что ли? Он с C++98 есть.
N>Что-то я не вижу у valarray многомерности.
Objects of type std::gslice can be used as indices with valarray's operator[] to select, for example, columns of a multidimensional array represented as a valarray.
Здравствуйте, σ, Вы писали:
σ>Здравствуйте, _hum_, Вы писали:
__>>А появилась ли возможность в новых версиях языка (до с++15 включительно) организовывать и работать с многомерным вектором, который бы хранил данные последовательно (как развертку многомерного массива в одномерный) в одном линейном буфере? [Чтобы быстро выполнять копирование, чтобы просто выполнять резервирование памяти, вычисление объема данных и т.п.]
σ>valarray нужен, что ли? Он с C++98 есть.
не совсем. хочу что-то типа
mvalarray<double> A;
A.resize(10,20,2); // равносильно созданию одномерного double-массива размером 10*20*2for(int i1 = 0; i1 < A.dim(0); ++i1)
for(int i2 = 0; i2 < A.dim(1); ++i2)
for(int i3 = 0; i3 < A.dim(2); ++i3)
A[i1][i2][i3]=i1*i2*i3; // равносильно операции с одномерным A[i1*10*20 + i2*20 + i3] = ...
std::vector<double> v(A.size());
copy(v.data(), A.data(), A.data() + A.size()); // копирование данных массива A в вектор
copy(A.data(), v.data(), v.data() + v.size()); // копирование содержимого вектора в массив A
то есть, чтобы был многомерный массив, но при случае его можно было рассматривать как одномерный (например, для того, чтобы быстро сериализовать и десериализовать).
Здравствуйте, _hum_, Вы писали:
__>Здравствуйте, σ, Вы писали:
σ>>Здравствуйте, _hum_, Вы писали:
__>>>А появилась ли возможность в новых версиях языка (до с++15 включительно) организовывать и работать с многомерным вектором, который бы хранил данные последовательно (как развертку многомерного массива в одномерный) в одном линейном буфере? [Чтобы быстро выполнять копирование, чтобы просто выполнять резервирование памяти, вычисление объема данных и т.п.]
σ>>valarray нужен, что ли? Он с C++98 есть.
__>не совсем. хочу что-то типа __>[ccode] __>mvalarray<double> A; __>A.resize(10,20,2); // равносильно созданию одномерного double-массива размером 10*20*2
__>for(int i1 = 0; i1 < A.dim(0); ++i1) __> for(int i2 = 0; i2 < A.dim(1); ++i2) __> for(int i3 = 0; i3 < A.dim(2); ++i3) __> A[i1][i2][i3]=i1*i2*i3; // равносильно операции с одномерным A[i1*10*20 + i2*20 + i3] = ...
operator[] должен будет в рантайме проверять, можно ли его ещё применить или уже нет?
Конечно, это реализуемо возвратом из operator[] прокси-типов, но наверное тоскливо по производительности будет.
Здравствуйте, _hum_, Вы писали:
__>А появилась ли возможность в новых версиях языка (до с++15 включительно) организовывать и работать с многомерным вектором, который бы хранил данные последовательно (как развертку многомерного массива в одномерный) в одном линейном буфере? [Чтобы быстро выполнять копирование, чтобы просто выполнять резервирование памяти, вычисление объема данных и т.п.]
Включили бы Eigen чтоли. После некоторой архитектурной оптимизации.
Сильно не хватает аналога numpy...
Здравствуйте, jazzer, Вы писали:
σ>>>valarray нужен, что ли? Он с C++98 есть.
N>>Что-то я не вижу у valarray многомерности.
J>Objects of type std::gslice can be used as indices with valarray's operator[] to select, for example, columns of a multidimensional array represented as a valarray. J>http://en.cppreference.com/w/cpp/numeric/valarray/gslice
Это закат солнца вручную, ничем не лучше прямого вычисления в стиле [i*isize+j*jsize+k] для каждого обращения.
Не годится.
На самом деле, написать такой массив (и даже больше — с ненулевым началом индексации, не прямоугольной формы и т.д.) относительно тривиально, и это делалось неоднократно. Но к valarray оно не относится.