提问者:小点点

当只在运行时知道时,是否有一种有效的方法来初始化多维向量的大小?


我有一个类有一个三维向量作为它的变量之一。这个向量的大小要到运行时才能知道。有没有一个有效的方法来初始化这个矢量?

例如,我的类可能是

class Foo {
public: 
    std::vector<std::vector<std::vector<float>>> x;
    std::vector<std::vector<std::vector<float>>> y;
    std::vector<std::vector<std::vector<float>>> z;

    std::vector<std::vector<std::vector<float>>> bar;

    int ni;
    int nj;
    int nk;
}

使用构造函数

Foo::Foo(std::vector<std::vector<std::vector<float>>> x_,
         std::vector<std::vector<std::vector<float>>> y_,
         std::vector<std::vector<std::vector<float>>> z_) {
    x = x_;
    y = y_;
    z = z_;

    ni = x.size();
    nj = x[0].size();
    nk = x[0][0].size();

    std::vector<std::vector<std::vector<float>>> tmp(ni, std::vector<std::vector<float>>(nj, std::vector<float>(nk)));
    bar = tmp;
}

我可以在不赋值虚拟变量tmp的情况下完成上面的最后两行吗?


共1个答案

匿名用户

您可以使用resize()和几个for循环来设置bar。这不是最漂亮的解决方案,但它应该有相当好的性能,因为没有创建临时任务,也没有不必要的分配。那看起来就像

bar.resize(ni);
for(auto& twodee : bar)
{
    twodee.resize(nj);
    for(auto& onedee : twodee)
        onedee.resize(nk);
}

现在`bar的大小相同,并且用0填充。