1

我想定义一个 3 维向量,其中前两个维度是固定的,但我希望第三个向量由循环内调用的函数动态填充。

我不完全确定这是否被允许,但我已经尝试通过以下方式实现它:

#define NUM 6

vector<vector<vector<double> > > foo;

foo.resize(NUM);
for(int j1=0; j1 < NUM; j1++){
    foo[j1].resize(NUM);
}

while(<condition>){
    fun(foo);
}

我将函数 fun 声明为

void fun(vector<vector<vector<double> > >& foo){
    for(int j1=0; j1<NUM; j1++){
        for(int j2=j1+1; j2<NUM; j2++){
             if(<condition>){
                   foo[j1][j2].push_back(<value>);
             }
         }
     }
 }

我最初测试了 NUM 等于 5 并且一切看起来都很好,但是当我尝试将其更改为 6 时,我遇到了分段错误。

我已经看到,即使我不尝试用 push_back 填充第三维(即我注释 push_back 行),对以 foo 作为参数的函数的简单调用也会弄乱 foo 的维度,即如果我插入一个

  cout << foo.size() << endl;

在 while 循环中,我看到 foo 的维度在第一次迭代后发生了变化,从 NUM 变为随机数。

我还发现这取决于平台,因为我在 Linux Ubuntu 上遇到错误,但在 MacOSX 上却没有。所以我想我在做一些与内存分配有关的真正错误的事情,但我不知道到底是什么。有人可以向我解释一下吗?

谢谢您的帮助!

4

2 回答 2

1

实际上,您可以使用向量构造函数创建一个具有固定数字大小的 3D 矩阵和所需大小的 2D 矩阵,该向量构造函数将元素的数量和一个用于制作副本以填充向量的元素作为参数。这是它的样子:

#include <iostream>
#include <vector>

int main() {
    const size_t NUM = 6;
    std::vector< std::vector< std::vector<double> > > Matr(NUM, std::vector< std::vector<double> >(NUM, std::vector<double>()));
    std::cout << "num 2D matrices - " << Matr.size() << std::endl;
    for(size_t j1 = 0; j1 < Matr.size(); ++j1){
        std::cout << "num rows - " << Matr[j1].size() << std::endl;
        for(size_t j2 = 0; j2 < Matr[j1].size(); ++j2) {
            Matr[j1][j2].push_back(0.09l);
            std::cout << "num columns - " << Matr[j1][j2].size() << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}
于 2012-05-22T16:47:05.287 回答
0
foo.resize(NUM);  
for(int j1=0; j1 < NUM; j1++){  
    foo[j1].resize(NUM);
}

在这里你正在调整大小foo[j1],但还没有任何东西foo[j1]..
所以foo[j1]只是一个垃圾。

于 2012-05-21T12:23:14.230 回答