Как я могу использовать a std::valarray
хранить/управлять 2D массив?
Я хотел бы видеть пример 2D массива с элементами, к которым получает доступ строка/индексы столбца. Что-то вроде этого псевдо код:
matrix(i,j) = 42;
Пример того, как инициализировать такой массив, также был бы хорош.
Я уже знаю о Повышении. MultiArray, Boost.uBlas и Блиц ++.
Не стесняйтесь отвечать, почему я не должен использовать valarray для своего варианта использования. Однако я хочу, чтобы память для многомерного массива была непрерывным (столбцы x строки) блок. Никакие вложенные массивы стиля Java.
Python позволяет «поймать» неуточненные именованные аргументы в дикт, что довольно удобно
>>> def f(**kw):
... print kw
...
>>> f(size=3, sides=6, name="hexagon")
{'sides': 6, 'name': 'hexagon', 'size': 3}
-121--4746357- Я обнаружил, что, используя socket.setReuseAddress (boolean)
, вы можете сказать JVm
С верхней части головы:
template <class element_type>
class matrix
{
public:
matrix(size_t width, size_t height): m_stride(width), m_height(height), m_storage(width*height) { }
element_type &operator()(size_t row, size_t column)
{
// column major
return m_storage[std::slice(column, m_height, m_stride)][row];
// row major
return m_storage[std::slice(row, m_stride, m_height)][column];
}
private:
std::valarray<element_type> m_storage;
size_t m_stride;
size_t m_height;
};
std:: valarray
предоставляет много интересных способов доступа к элементам, через срезы, маски, многомерные срезы или таблицу косвенности. Дополнительные сведения см. в разделах std:: slice _ array
, std:: gslice _ array
, std:: маска _ массив
и std:: непрямой _ массив
.
Вот пример пример, который включает в себя немного манипуляции матрицы
#include <iostream>
#include <valarray>
using namespace std;
typedef valarray<valarray<int> > va2d;
int main()
{
int data[][3] = { {1, 2, 3}, {4, 5, 6} };
va2d mat(valarray<int>(3), 2);
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 3; ++j)
mat[ i ][ j ] = data[ i ][ j ];
}
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 3; ++j)
cout << mat[ i ][ j ] << endl;
}
Подробнее о valarray
:
векторный
контейнер со специальными функциями-членами для нарезки и нарезки кубиками. доступ к векторам
может быть быстрее valarray
: Например: 3 Кроме того, многие функции-члены и связанные функции valarray могут быть {{1 }} успешно создан и будет демонстрировать четко определенное поведение, если и только если T удовлетворяет дополнительным требованиям, указанным для каждого такого члена или связанной функции.
4 [ Пример: создание экземпляра valarray допустимо, но оператор> () не будет успешно создан для операндов valarray, поскольку { В комплексе {1}} нет упорядочивающих операторов . —Конечный пример]
Правка №2: Стандарт гарантирует, что вектор
, как и массивы, всегда использует непрерывную память. Кроме того, у нас есть:
26.5.2 Шаблон класса valarray
1 Шаблон класса valarray представляет собой одномерный интеллектуальный массив с элементами, пронумерованными последовательно от нуль. Это представление математической концепции упорядоченного набора значений.Иллюзия более высокой размерности может быть создана знакомой идиомой вычисляемых индексов вместе с мощными возможностями разбиения на подмножества, предоставляемыми обобщенные индексные операторы.
и далее:
26.5.2.3 доступ к элементу valarray
4 Аналогично, выражение & a [i]! = & b [j] оценивается как истинное для любых двух массивов a и b и для любых size_t i и size_t j таких, что i меньше , длина a и j меньше длины b. Это свойство указывает на отсутствие псевдонимов и может быть использовано с пользой для оптимизации компиляторов.