具有可变范围的std :: vector不起作用

时间:2016-09-18 22:43:27

标签: c++ list

我的问题:

当我这样做时:

std::vector<int> pigeonhole[100]; 

它有效,但我需要一个变量。

当我把它,

std::vector<int> pigeonhole(range); 

以下部分失败;它说

  

错误表达式必须具有类类型。

pigeonhole[arr[i]-min].push_back(arr[i]); 
与此部分相同:pigeonhole[i]

void pigeonholeSort(int arr[], int n)
{
    int min = arr[0], max = arr[0];
    for (int i = 1; i < n; i++)
    {
        if (arr[i] < min)
            min = arr[i];
        if (arr[i] > max)
            max = arr[i];
    } 

    int range = max - min +1;
    std::vector<int> pigeonhole(range);

    for (int i = 0; i < n; i++)
      pigeonhole[arr[i]-min].push_back(arr[i]);

    int index = 0;  
    for (int i = 0; i < max; i++)
    {
       vector<int>::iterator it;
       for (it = pigeonhole[i].begin(); it != pigeonhole[i].end(); ++it)
            arr[index++]  = *it;
    }
}

1 个答案:

答案 0 :(得分:1)

[]是数组语法。 vector不是一个数组,它是一个实现类似于数组但具有size()属性的动态类的类。

std::vector<int> pigenhole(100);

创建一个包含100个类型为int的默认初始化对象的向量。

如果您尝试创建100个int类型的向量,那么

std::vector<int> pigenhole[100];

这样做。如果您需要的是动态数量的矢量,那么您需要

std::vector<std::vector<int>> pigenhole;

然后你可以相应地调整它的大小:

pigenhole.resize(10);
pigenhole[0].push_back(1);

上面告诉pigenhole创建10个向量,然后将1推送到10个中的第一个。

请注意,vector类实现operator[],以便可以以类似数组的方式使用

std::vector<int> v;
v.push_back(1);
v.push_back(2);
std::cout << v[1] << "\n";  // calls v.operator[](2) and prints 2

如果您想要的是动态大小的整数集合,那么您需要

std::vector<int> pigenhole(range);
for (int i = 0; i < n; i++)
  pigeonhole[arr[i]-min] = arr[i];

pigenhole的类型为std::vector<int>,因此pigenhole[n]会在您编写的原始代码中返回int,而非vector

  pigeonhole[arr[i]-min].push_back(arr[i]);

这没有意义 - 您正试图在push_back上致电int

如果您尝试在每个外部pigenhole上存储多个值,那么您需要

std::vector<std::vector<int>> pigenhole(range);
for (int i = 0; i < n; i++)
  pigeonhole[arr[i]-min].push_back(arr[i]);