我正在生成20,000个随机数(双精度)的向量,我想,除了将数字放在此向量中,在此处称为A之外,还将0.0到0.1之间的所有数字复制到单独的向量中。当我尝试这样做时,我的编译器(最新的g ++版本)给了我这些错误:
"error: request member 'begin' in 'r0', which is of non-class type 'std::vector<double>()' for (it0=r0.begin(); it0!=r0.end();++it0)"
"error: request member 'end' in 'r0', which is of non-class type 'std::vector<double>()' for (it0=r0.begin(); it0!=r0.end();++it0)"
"error: request for member 'emplace_back' in 'r0', which is of non-class type 'std::vector<double>()' r0.emplace_back(A[i]);"
我是C ++的相对新手,但我认为向量数据结构有名为.begin()和.end()的方法/成员函数,它们可以帮助使用迭代器访问它。在我看来,编译器没有看到我的矢量作为矢量?我真的不确定,但下面就是我所做的:
我已链接:iostream,cmath,fstream,time.h,cstdlib,vector,stdio.h,cstdio,iomainip,algorithm(按此顺序)
以下是我现在的代码:
int main() {
double N=20000;
std::vector<double> A(N+1);
std::vector<double> r0();
std::vector<double>::iterator it0;
std::srand((unsigned)time(0));
for(double i = 0; i<(N+1); ++i) {
double high = 1.0, low = 0.0;
A[i]=((double) rand()/(static_cast<double>(RAND_MAX) + 1.0))*(high - low)+low;
for(it0=r0.begin(); it0!=r0.end(); ++it0) {
if(0.0<=A[i] && A[i]<0.1) { //NOTE:post-incrementing creates an unnecessary temporary iterator
rand1.emplace_back(A[i]);
count0++;
}
}
}
return 0;
}
这一点是我将向量A中的所有数字放入每个大小为0.1的区间,从0.0开始,然后使用gnuplot在直方图中绘制它们以评估随机数的均匀性(使用linux mint附带的伪随机数生成器)。 另外,我想问一下.emplace_back()的优点是什么.push_back()。非常感谢您的帮助!我真的很感激,因为我不知道自己做错了什么。
答案 0 :(得分:2)
std::vector<double> r0();
你已成为most vexing parse的受害者(虽然这个案例可能不像链接的例子那样烦恼)。上面的行定义了一个名为r0
的函数,该函数不带参数,并按值返回std::vector<double>
。摆脱尾随的括号,你的代码应该编译。
您的代码中的另一个奇怪之处在于您说您要生成20,000个随机数,但是您生成的是20,001。您不需要继续使用N+1
,请将其替换为N
。
正如lizusek在评论中指出的那样,你在下面的语句中毫无意义地迭代空向量(r0
):
for(it0=r0.begin(); it0!=r0.end(); ++it0) { // this loop is never entered
最后,你不应该再使用rand()
和朋友了,C ++ 11在<random>
标题中提供了更优越的随机数生成功能。我将你的代码重写为
std::mt19937 gen(std::random_device{}());
std::uniform_real_distribution<> dis(0, 1);
for(int i=0; i<N; ++i) {
A[i] = dis(gen);
if(A[i] > 0 && A[i] < 0.1) {
// add this to the r0 vector
r0.push_back(A[i]);
}
}
答案 1 :(得分:1)
std::vector<double> r0();
将其解析为不带参数的函数并返回std::vector<double>
。这称为most vexing parse错误。循环中也有错误。这应该是:
std::vector<double> r0;
for( int i = 0; i < N+1; ++i) {
if(0.0<=A[i] && A[i]<0.1) {
//...
}
}