【发布时间】:2013-11-18 09:17:37
【问题描述】:
我正在尝试将向量拆分为 n 个部分。 我检查了以下解决方案How to split a vector into n "almost equal" parts
我根据此评论得出以下代码: 要获得每个部分大小的基数,只需将总和除以部分数:11/3 = 3。显然,某些部分需要大于该值才能获得正确的总和,但是这只是余数:11 % 3 = 2。所以现在您知道其中 2 个部分的尺寸为 3+1,剩下的部分将是 3。(Mark Ransom)
int main()
{
std::vector<int> lines;
int size = 200;
for(int i = 0; i < size;i++)
{
lines.push_back(i);
}
int p = 6;
int right = round((double)size/(double)p);
for(int i = 0; i < p;i++)
{
if( i < size - left)
{
vector<int> v;
for(int j = 0; j < right; j++)
{
v.push_back(lines[j]);
}
cout << v.size() << endl;
}
else if (i > size - left)
{
vector<int> v;
for(int k = 0; k < right; k++)
{
v.push_back(lines[k]);
}
cout << v.size() << endl;
}
}
return 0;
}
p = 6 和 size = 200 的输出是:33,33,33,33,33,33 = 198
p = 6 和 size = 1000 的输出为:167,167,167,167,167,167 = 1002
两个输出都是错误的。我错过了什么?
编辑后:
所以让我理解。 我们将 i 增加 right,表示 chunk 或 sub-vector 的大小。 虽然 i 小于 size-right 我们什么都不做。当 i 变得更大时,我们必须处理 Leftovers 我们将块的大小更改为 right = size - i。
int main()
{
std::vector<int> lines;
int size = 1000;
for(int i = 0; i < size;i++)
{
lines.push_back(i);
}
int p = 6;
int right = round((double)size/(double)p);
int left = size % p;
for(int i = 0; i < size; i+= right)
{
if(i < size - right)
{
vector<int> v;
//MAJOR CORRECTION
for(int j = i; j < (i+right); j++)
{
v.push_back(lines[j]);
}
cout << v.size() << endl;
}
else
{
right = size - i;
vector<int> v;
//Major Correction
for(int k =i; k < size; k++)
{
v.push_back(lines[k]);
}
cout << v.size() << endl;
}
return 0;
}
谢谢。
输出:33 33 33 33 33 33 2 = 200
【问题讨论】:
-
一方面,您在外部循环中使用
i,然后在内部循环中再次调用您的变量i。现在还不清楚使用的是哪一个,所以你可能想用不同的方式来称呼它。 -
是的,我正在检查@CompuChip,我会再次运行它
-
我也不太明白尺寸 - 左
if-statement。您的right是块的“标准”大小,对吗?所以你可以继续从向量中取出right元素,直到你注意到i < size - right,然后你只需设置right = size - i就可以了。 -
但是您是从
i的下一个值开始每个向量,对吧?你不想在你的外循环中使用i += right之类的东西吗? -
不应该是
right = size - i;在你的else中而不是你的if中吗? :-)