2011-01-11 74 views
1

新手的问题,我写了这个功能约指针STL

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; 
} 

,但是当我把它从主,将myvec = randIntSequence(10),我看到了myvector总是空的。我应该修改返回值吗?

+4

一个人不应该用`new`来分配标准容器 - 这种做法会让人失望!另外,你的第一个`for`循环是无操作的。 – 2011-01-11 23:54:34

+3

这种设计看起来很可疑。你为什么动态地分配`vector`?是否有一个特定的原因,你不是只是在堆栈上创建它并返回它?随机数生成器能抛出异常吗?你有没有考虑过使用智能指针? – 2011-01-11 23:55:25

+0

是的,我忘了将i分配给缓冲区的第i个元素。我的问题没有指针是这样的:如果我想在某个点上删除矢量,在函数外面,它会被完全删除吗? – Bob 2011-01-12 00:07:45

回答

4

你从来没有分配给任何在vector元素指向buffer

for (long int i = 0; i < n; i++) 
    buffer->at(i); // do you mean to assign something here? 

您使用含有n零的vector结束。

5

swap调用将*buffer指针编入索引,就像它是一个数组并且指针交换一样。你的意思是交换矢量的项目。试试这个修改:

swap((*buffer)[i], (*buffer)[j]); 

继发的是,像您期望您的来电at不设定值。你正在拉出矢量中的物品,但没有将它们设置为任何东西。请尝试以下其中一种语句:

buffer->at(i) = i; 
(*buffer)[i] = i; 
3

您的问题已经得到解答,所以我会做这个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; 
} 

你绝对没有理由在这里使用指针。除非你有一些更高级的随机洗牌方法,你应该使用std::random_shuffle。你也可以考虑使用boost::counting_iterator初始化向量:

std::vector<long int> buffer(
    boost::counting_iterator<long int>(0), 
    boost::counting_iterator<long int>(n)); 

虽然这可能是矫枉过正。

1

由于问题是关于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()); 

但是,如果你想修复你的函数,那么

  • nsize_tlong int
  • 第一环路无操作
  • 正如约翰所说,buffer是一个点ter,所以buffer[0]是你的矢量,而buffer[i]对于i!=0是垃圾。看起来你很幸运能够获得一个零大小的矢量而不是一个损坏的矢量!
  • 你打算做随机洗牌吗?如果是的话,你正在洗零。如果你只是想生成随机条目,那么你为什么不循环矢量(从0到buffer-> size(),而不是其他方式!!)并分配你的随机数?

C++不是垃圾收集,你可能不希望智能指针这样简单的东西,所以你一定会最终泄漏。如果原因在于生成一个堆向量,并且为了性能的缘故,通过指针返回会避免副本,那么我的建议是不要这样做!以下是(几乎)完美的选择,无论是清晰度和性能:

vector<T> randIntSequence(size_t n) { 
    vector<T> buffer(n); 
    // bla-bla 
    return buffer; 
} 

如果你认为这是多余的复印左右这里,阅读this,相信你的编译器。