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

Code stores a vector as a vector<vector>, why no error message?

本文关键字:向量 为什么 有错误 消息 gt lt 代码 vector 存储      更新时间:2023-10-16

我正在处理前辈留下的一段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 函数修改,它仍然应该保持长整数的向量。我错过了什么?

vector<vector<long> >具有类型为 vector<long> 的元素。

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

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

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

编译该代码没有问题。向量元素可以是基元(整数、浮点数、双精度(、指针或其他对象(如向量或用户定义的类(。

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的使用者访问这些值的方式。