关于c ++中的向量

时间:2011-04-22 15:52:47

标签: c++ stl

我想创建一个函数,生成一个随机数列表,其中包含用户插入的大小,以便在这些randoms上应用一些排序算法,为什么此代码不运行..plz help

vector<int> DataList; 

int GenerateRandomList(int min, int max, int size)
{
    srand ( time(NULL) );
    for(int i=0;i<size;i++)
    {
        DataList[i]=rand()% max+min;
        cout<<DataList[i];
        cout<<endl;
    }
}

3 个答案:

答案 0 :(得分:4)

您的矢量为空,您无法分配给不存在的元素。

只需将DataList[i] = ...替换为DataList.push_back(...)即可。

此外,rand() % max + min无法执行您想要的操作,因为max - min + 1min(包括)之间只有max个数字。 rand() % (max - min + 1) + min应该有用。

此外,srand应在main开头调用一次,然后再调用一次。否则,如果连续两次调用GenerateRandomList,则可能会得到相同的数字序列。

另外,为什么声明函数返回int?您应该将其更改为voidstd::vector<int>并返回刚刚生成的数字,而不是具有全局向量。

答案 1 :(得分:1)

执行此操作的好方法是使用std::generate。链接页面上的示例涵盖了您的问题。

在您的特定情况下,您必须使用仿函数:

struct GenerateRandomList {
    GenerateRandomList(int min, int max)
    : min(min), max(max)
    {
        srand(time(NULL)); 
    }

    int operator()() const { 
        // this is courtesy of @FredOverflow's answer
        return rand() % (max - min + 1) + min; 
    }
private:
    int min;
    int max;
};

// for generating
std::vector<int> DataList(10);
std::generate(DataList.begin(), DataList.end(), GenerateRandomList(10, 20));

您可以看到一个有效的例子here。这种方法的优点是,您可以为任何类型的容器(数组,列表,向量,集合)生成随机数。

答案 2 :(得分:0)

我认为你的问题是你想做push_back(int)而不是做DataList [i] = rand()%max + min;。以下代码编译并完成我认为您正在尝试做的事情。

#include <vector>
#include <stdlib.h>
#include <iostream>

using namespace std;

vector<int> DataList;
int GenerateRandomList(int min, int max, int size) {
   srand ( time(NULL) );
   for(int i=0;i<size;i++) {
     DataList.push_back(rand()% max+min);
    cout<<DataList[i];
    cout<<endl;
   }
}


int main() {
  GenerateRandomList(0,15,10);
}