代码之家  ›  专栏  ›  技术社区  ›  Emile Cormier

如何使用std::valarray存储/操作连续的二维数组?

  •  7
  • Emile Cormier  · 技术社区  · 15 年前

    我怎样才能使用一台电脑 std::valarray 要存储/操作二维数组?

    我想看一个2D数组的示例,其中的元素通过行/列索引访问。类似于以下伪代码:

    matrix(i,j) = 42;
    

    一个如何初始化这样一个数组的例子也很好。

    请随意回答为什么我不应该在我的用例中使用valarray。但是,我希望多维数组的内存是连续的(列x行)块。没有Java风格的嵌套数组。

    4 回复  |  直到 10 年前
        1
  •  12
  •   MSN    12 年前

    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::mask_array ,及 std::indirect_array

        2
  •  5
  •   NoDataDumpNoContribution    10 年前
    #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 :

    • 它针对数值计算进行了优化。
    • 这是一个 vector 类似于具有用于切片和切割的特殊成员函数的容器。
    • 没有迭代器
    • 矢量
    • valarray<T> :例如:

    3此外,许多成员和相关人员 已成功实例化并将 只有当T满足附加条件时 为每一个此类项目规定的要求 成员或相关职能。

    示例:实例化是有效的 valarray,但运算符>() 将不会成功实例化 对于数组操作数,自 复合体没有任何排序 接线员。[结束示例]

    ,与数组一样,始终使用连续内存。此外,我们还有:

    26.5.2类模板数组

    1类模板valarray是一个 一维智能阵列,具有 价值观。更高层次的幻觉 维度可以由 与强者一起 由提供的子集功能 广义下标算子。

    此外:

    4.同样地;a[我]= &b[j]对任意两个变量的计算结果均为真 数组a和b以及任意大小的\u t i 尺寸j,使我小于 b的长度。此属性表示 通过优化编译器来获得优势。

        3
  •  0
  •   Herling G.A.    7 年前

    如果要测试多维数组是否为连续(列x行)块。您可以使用

    template<class T>
    class Array: public std::valarray<T> {
      size_t row,col; 
    public:
      Array(){}
      Array(size_t nx) : std::valarray<T>(nx){row=nx,col=1;}
      Array(size_t nx, size_t ny) : std::valarray<T>(nx*ny){row=nx,col=ny;}
      virtual ~Array(){}
      T& operator()(size_t i,size_t j) { return (*this)[i*col+j];}
      size_t Size(size_t n) const { return (n<2) ? col: row;}
    };
    
        4
  •  -1
  •   Liz Albin    15 年前

    Here's 一个包含一些矩阵操作的示例