代码将向量存储为向量<vector>,为什么没有错误消息?

时间:2018-04-11 10:14:30

标签: c++ vector

我正在研究前任留下的一段C ++代码,它显然将vector<long int>存储为vector<vector<long int>>。代码编译并运行,但我不明白为什么。这是存储的功能。

void setPotentialParameters(const int& seed, const int& nMax, const double& lambdaStd, const int fieldNum, potentialPars& par)
{
    gsl_rng * r = gsl_rng_alloc (gsl_rng_taus);
    gsl_rng_set (r, seed);
    par.nMaximum= nMax;
    par.fNum= fieldNum;
    for (int i=0; i<100; i++) gsl_ran_gaussian (r, lambdaStd);
    int counter=0;
    vector<long int> tempNs(fieldNum); //Defines tempNs as a vector<long int>
    for (long int i=0; i< (-0.2+pow(2*nMax+1, fieldNum)); i++) { 
        findPartition(i, fieldNum, 2*nMax+1, tempNs ); 
        for (int i = 0; i < tempNs.size(); i++) {
            tempNs[i] -= nMax;
        }
        if (goodPartition(tempNs, nMax)) {
            counter++;
            par.lambdas.push_back(abs( gsl_ran_gaussian (r, lambdaStd))); 
            par.nVals.push_back(tempNs); //Stores tempNs in nVals
            par.alphas.push_back(2*M_PI * gsl_rng_uniform (r));
        };
    };
};

这是tempNs存储的结构。

struct potentialPars{
    int nMaximum;
    int fNum;
    vector<double> lambdas;
    vector<vector<long int> >  nVals; //Defines nVals as a vector<vector<long int>>
    vector<double> alphas;
};

我用评论标记了三条最相关的行。 tempNs只有一个元素(从tempNs[i] -= nMax行看),与它的定义一致vector<long int>但是当在程序的其他地方调用nVals时它有两个元素,也与它的定义一致vector<vector<long int>>。这似乎不可能。即使tempNs被findPartition函数修改,它仍然应该是长整数的向量。我错过了什么?

3 个答案:

答案 0 :(得分:1)

使用longs向量的向量没有问题。 它几乎与使用二维数组相同,但您不需要在编译时知道大小或管理内存分配。

编译该代码没有问题。向量元素可以是基元(int,float,double),指针或其他对象(如vector或用户定义的类)。

答案 1 :(得分:1)

std::vector的(第一个)类型参数的约束相当宽松。几乎所有非引用类型都可以存储在std::vector中,包括其他内容的std::vector。这正是这段代码的作用。

您可以将std::vector<long int>包裹在

struct partition { 
    std::vector<long int> indexes; 
    double lambda; 
    double alpha; 
}; 

并将potentialPars更改为

struct potentialPartitions {
    int nMaximum;
    int fNum;
    std::vector<partition> partitions;
};

这会增加清晰度,但会改变potentialPartitions的消费者访问这些值的方式。

答案 2 :(得分:1)

vector<vector<long> >包含vector<long>类型的元素。

vector push_back()方法将元素复制到向量。

在您显示的代码中,par.nValues属于vector<vector<long> >类型,因此推送tempNS - 类型为vector<long> - 是完全合适的。