代码将向量存储为向量<vector>,为什么没有错误消息?
Code stores a vector as a vector<vector>, why no error message?
我正在处理前辈留下的一段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
的使用者访问这些值的方式。
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 为什么一个向量上的多线程操作很慢
- 为什么C++常量模板化向量在使用之前没有初始化?
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- 为什么向量内部的指针在从函数返回时会发生变化?
- 为什么不允许使用可变长度数组作为向量元素?
- 为什么我在向量初始化时收到此错误?
- 为什么我必须在作案操作中解析向量的大小?
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- 为什么即使使用 for 循环遍历我的向量,它也没有输出到控制台?(C++)
- 为什么负数不取模向量大小给出负数?
- 为什么这种向量声明无效?
- 为什么在向量上使用 std::find() 时会出现错误?
- 为什么在此排序算法实现中,向量明显比数组慢?
- 为什么我的向量::擦除调用会抛出"vector subscript out of range"?
- 在 C++ 中将元素添加到空向量:为什么 push.back 有效而 [] 无效
- 用不重复的随机数填充向量.为什么不工作