我正在研究前任留下的一段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函数修改,它仍然应该是长整数的向量。我错过了什么?
答案 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>
- 是完全合适的。