我的问题:
当我这样做时:
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;
}
}
答案 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]);