3D矢量与2个未知的大小和1已知的大小

时间:2015-04-02 18:31:31

标签: c++ visual-studio vector

我的程序接收2维作为命令行参数(M表示宽度,N表示高度)。只要M和N在[3-10000]之间,我就必须处理任何尺寸。

我想计算矩阵中的值(由3D矢量表示),但我想保留先前的值来计算新值(这就是为什么一个维度只有2个深度:0 =旧,1 =新)。

这会给我一个类似matrix[M][N][2]matrix[2][M][N]的结构。我没有偏好(无论哪个更简单,可能是后者)。

由于M和N只在运行时才知道,所以我不能使用简单的数组(我可以用双***但我不想弄乱内存分配)

我应该为3个维度中的每个维度使用向量,还是仅为那些未知的维度使用向量?换句话说,我应该使用一个简单的数组用于0 = old,1 = new和M和N的向量?

无论选择哪一个,我都在努力让它发挥作用。如何创建和初始化它?

2 个答案:

答案 0 :(得分:4)

  

我应该为3个维度中的每一个使用vector吗?

是的,你应该。

当标准库为您提供功能时,编写自己的内存分配和释放代码没有任何优势。

  

无论选择哪一种,我都在努力使其成功,我该如何创建和初始化它?

假设您已经找到了如何从命令行获取MN,您可以使用:

std::vector<int> d1(N, 0);
std::vector<std::vector<int>> d2(M, d1);
std::vector<std::vector<std::vector<int>>> matrix(2, d2);

您也可以将它组合成一行:

std::vector<std::vector<std::vector<int>>> matrix(2, std::vector<std::vector<int>>(M, std::vector<int>(N, 0)));

我更喜欢第一种方法。跟进正在做的事情会更容易。

答案 1 :(得分:3)

如果您只使用两个矩阵,我将使用长度为2的数组:

std::array<std::vector<std::vector<int>>, 2 > matrices{ {
    std::vector<std::vector<int>>(M, std::vector<int>(N, 0)),
    std::vector<std::vector<int>>(M, std::vector<int>(N, 0))
} };

用法:

int a=matrices[0][M][N];

虽然我认为你的程序会从某些类型的别名中受益。这是一个完整的例子:

#include <vector>
#include <array>
#include <iostream>

template<class T>
using Row = std::vector < T > ;

template<class T>
using Matrix = std::vector < Row<T> > ;

std::array<Matrix<int>, 2 > matrices;

int main()
{
    size_t M, N;
    int d;
    std::cin >> M;
    std::cin >> N;
    std::cin >> default;
    matrices.fill(Matrix<int>(M, Row<int>(N,d)));

    for (auto& r : matrices[0]){
        for (auto& e : r) {
            std::cout << e << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}