ベクトルを n 個の部分に分割しようとしています。次の解決策を確認しましたベクトルをn個の「ほぼ等しい」部分に分割する方法
このコメントに基づいて、次のコードを作成しました。 各パーツのサイズの基数を取得するには、単純に合計をパーツの数で割ります: 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、サイズ = 200 の出力は、33,33,33,33,33,33 = 198 です。
p = 6 およびサイズ = 1000 の出力は、167,167,167,167,167,167 = 1002 です。
両方の出力が間違っています。私は何が欠けていますか?
編集後:
だから私に理解させてください。チャンクまたはサブベクトルのサイズを表すiを右にインクリメントします。私はサイズが正しいよりも小さい間、私たちは何もしません。i が大きくなると、残り物に対処する必要があり、チャンクのサイズを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