声明多维std::数组的更简洁的方式



简短的问题:有没有更短的方法?

array<array<atomic<int>,n>,m> matrix;

我希望是这样的

array< atomic< int>,n,m> matrix;    

模板别名可能会有所帮助:

#include <array>
template <class T, unsigned I, unsigned J>
using Matrix = std::array<std::array<T, J>, I>;
int main()
{
    Matrix<int, 3, 4> matrix;
}

对于还不支持模板别名的编译器来说,一个不错的解决方法是使用一个简单的元函数来生成类型:

#include <cstddef>
#include <array>
template<class T, std::size_t RowsN, std::size_t ColumnsN>
struct Matrix
{
    typedef std::array<std::array<T, ColumnsN>, RowsN> type; // row major
private:
    Matrix(); // prevent accidental construction of the metafunction itself
};
int main()
{
    Matrix<int, 3, 4>::type matrix;
}

使用可变模板的解决方案(比模板别名稍微复杂,但更通用)

template <typename T, std::size_t thisSize, std::size_t ... otherSizes>
class multi_array : private std::array<multi_array<T, otherSizes...>, thisSize>
{
 using base_array = std::array<multi_array<T, otherSizes...>, thisSize>;
 public:
    using base_array::operator[];
    // TODO: add more using statements to make methods
    // visible.  This is less typing (and less error-prone)
    // than forwarding to the base_array type.
};
template <typename T, std::size_t thisSize>
class multi_array<T, thisSize> : private std::array<T, thisSize>
{
 using base_array = std::array<T, thisSize>;
 public:
    using base_array::operator[];
    // TODO: add more using statements to make methods
    // visible.  This is less typing (and less error-prone)
    // than forwarding to the base_array type.
};

可以对数组的非叶节点赋值进行一些改进。

我测试了clang/LLVM的最新版本。

享受吧!

嵌套时,std::array会变得非常难读,而且不必要地冗长。相反的维度顺序尤其令人困惑。

例如:

std::array < std::array <int, 3 > , 5 > arr1; 

的比较
char c_arr [5][3]; 

另外,请注意,当您嵌套std::array时,begin()、end()和size()都返回无意义的值。

由于这些原因,我创建了自己的固定大小的多维数组容器,array_2d和array_3d。它们的优点是使用c++ 98。

它们类似于std::array,但用于2维和3维的多维数组。它们比内置多维数组更安全,性能也不差。我没有包含维度大于3的多维数组的容器,因为它们不常见。在c++ 11中,可变模板版本可以支持任意数量的维数(类似Michael Price的例子)。

二维变量的一个例子:

//Create an array 3 x 5 (Notice the extra pair of braces) 
fsma::array_2d <double, 3, 5> my2darr = {{ 
{ 32.19, 47.29, 31.99, 19.11, 11.19}, 
{ 11.29, 22.49, 33.47, 17.29, 5.01 }, 
{ 41.97, 22.09, 9.76, 22.55, 6.22 } 
}};  

完整的文档在这里:http://fsma.googlecode.com/files/fsma.html

你可以在这里下载这个库:http://fsma.googlecode.com/files/fsma.zip

这是一个简单的通用版本:

template <typename T, size_t d1, size_t d2, size_t... ds>
struct GetMultiDimArray
{
    using type = std::array<typename GetMultiDimArray<T, d2, ds...>::type, d1>;
};
template <typename T, size_t d1, size_t d2>
struct GetMultiDimArray<T, d1, d2>
{
    using type = std::array<std::array<T, d2>, d1>;
};
template <typename T, size_t d1, size_t d2, size_t... ds>
using MultiDimArray = typename GetMultiDimArray<T, d1, d2, ds...>::type;
// Usage:
MultiDimArray<int, 3, 2> arr {1, 2, 3, 4, 5, 6};
assert(arr[1][1] == 4);

相关内容

  • 没有找到相关文章

最新更新