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要简洁得多。