C++ 关于stl指针的新手问题
我已经写了这个函数C++ 关于stl指针的新手问题,c++,pointers,stl,vector,C++,Pointers,Stl,Vector,我已经写了这个函数 vector<long int>* randIntSequence(long int n) { vector<long int> *buffer = new vector<long int>(n, 0); for(long int i = 0; i < n; i++) buffer->at(i); long int j; MTRand myrand; for(long int i
vector<long int>* randIntSequence(long int n) {
vector<long int> *buffer = new vector<long int>(n, 0);
for(long int i = 0; i < n; i++)
buffer->at(i);
long int j; MTRand myrand;
for(long int i = buffer->size() - 1; i >= 1; i--) {
j = myrand.randInt(i);
swap(buffer[i], buffer[j]);
}
return buffer;
}
vector*randIntSequence(长整数n){
向量*缓冲区=新向量(n,0);
用于(长整数i=0;iat(i);
长整数j;MTRand myrand;
对于(长整数i=buffer->size()-1;i>=1;i--){
j=myrand.randInt(i);
交换(缓冲区[i],缓冲区[j]);
}
返回缓冲区;
}
但是当我从main调用它时,myvec=randIntSequence(10),我看到myvector总是空的。我要修改返回值吗?您从不将
缓冲区指向的向量中的任何元素赋值:
for (long int i = 0; i < n; i++)
buffer->at(i); // do you mean to assign something here?
for(长整数i=0;i在(i);//你的意思是在这里分配什么吗?
最后的向量
包含n
零。您从未将缓冲区指向的向量
中的任何元素赋值:
for (long int i = 0; i < n; i++)
buffer->at(i); // do you mean to assign something here?
for(长整数i=0;i在(i);//你的意思是在这里分配什么吗?
最后的向量
包含n
零。swap
调用将索引*缓冲区
指针,就像它是一个数组一样,并围绕指针交换。您的意思是围绕向量的项交换。尝试此修改:
swap((*buffer)[i], (*buffer)[j]);
其次,您的at
调用没有按预期设置值。您正在提取向量中的项,但没有将它们设置为任何值。请尝试以下语句之一:
buffer->at(i) = i;
(*buffer)[i] = i;
swap
调用正在索引*缓冲区
指针,就像它是一个数组一样,并且正在围绕指针交换。您的意思是围绕向量的项交换。尝试此修改:
swap((*buffer)[i], (*buffer)[j]);
其次,您的at
调用没有按预期设置值。您正在提取向量中的项,但没有将它们设置为任何值。请尝试以下语句之一:
buffer->at(i) = i;
(*buffer)[i] = i;
您的问题已经得到了回答,因此我将制作此CW,但这是您的代码的外观
std::vector<long int> randIntSequence(long int n)
{
std::vector<long int> buffer(n);
for(int i=0; i<n; ++i)
buffer[i] = i;
std::random_shuffle(buffer.begin(), buffer.end());
return buffer;
}
虽然这可能有点过分。您的问题已经得到了回答,所以我将制作此CW,但这是您的代码的外观
std::vector<long int> randIntSequence(long int n)
{
std::vector<long int> buffer(n);
for(int i=0; i<n; ++i)
buffer[i] = i;
std::random_shuffle(buffer.begin(), buffer.end());
return buffer;
}
尽管这可能有点过分。因为问题是关于STL的,而您只需要一个带有随机项的向量,那么:
std::vector<long int> v(10);
generate( v.begin(), v.end(), std::rand ); // range is [0,RAND_MAX]
// or if you provide long int MTRand::operator()()
generate( v.begin(), v.end(), MTRand() );
如果您认为这里有多余的复制,请阅读并信任您的编译器 因为问题是关于STL的,而您只需要一个带有随机项的向量,那么:
std::vector<long int> v(10);
generate( v.begin(), v.end(), std::rand ); // range is [0,RAND_MAX]
// or if you provide long int MTRand::operator()()
generate( v.begin(), v.end(), MTRand() );
如果您认为这里有多余的复制,请阅读并信任您的编译器 人们不应该为标准容器分配new
——这有点违背了这一点!此外,您的第一个for
循环是一个no-op。这种设计似乎令人怀疑。为什么要动态分配向量
?您不只是在堆栈上创建它并返回它,有什么特别的原因吗?随机数生成器能否引发异常?你考虑过使用智能指针吗?是的,我忘了给缓冲区的第I个元素赋值。我没有指针的问题是:如果我想在函数之外的某个点删除向量,它会被完全删除吗?听起来你应该使用std::random\u shuffle
。你需要在向量上推一些东西,使用。不应该为标准容器分配new
——这有点违背了这一点!此外,您的第一个for
循环是一个no-op。这种设计似乎令人怀疑。为什么要动态分配向量
?您不只是在堆栈上创建它并返回它,有什么特别的原因吗?随机数生成器能否引发异常?你考虑过使用智能指针吗?是的,我忘了给缓冲区的第I个元素赋值。我没有指针的问题是:如果我想在函数之外的某个点删除向量,它会被完全删除吗?听起来你应该使用std::random_shuffle
。你需要在向量上推一些东西,使用。很抱歉在这里重复其他人的评论。直到我发布了答案,我才意识到你的评论。很抱歉在这里重复别人的评论。直到我发布了答案,我才意识到你的评论。这不应该是评论吗?因为你从来没有完全回答过这个问题,而是用一个问题来回答。这不应该是一个评论吗?因为你从来没有完全回答过这个问题,而是用一个问题来回答。如果你的编译器支持C++0x,那么初始化for()
循环可以替换为std::iota(buffer.begin(),buffer.end(),0)代码>@blastfunner--酷,我不知道这个功能。我很难推荐boost::counting_迭代器,因为它太笨重了,但iota要简洁得多。如果编译器支持C++0x,那么初始化for()
循环可以替换为std::iota(buffer.begin(),buffer.end(),0)代码>@blastfunner--酷,我不知道这个功能。我很难推荐boost::counting_迭代器,因为它太笨拙了,但iota要简洁得多。