0

ベクトルを 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

4

2 に答える 2

1
int right = size/p; // don't round! this floors.
int left = size % p; // this one is correct.
for(int i = 0; i < p;i++)
        {
            if( i < size - left)
            {
                vector<int> v;
                for(int j = 0; j < right; j++) // counters, you used i here.
                {
                    v.push_back(lines[j]); // and here.
                }
                cout << v.size() << endl;

            }
            else if (i >= size - left)// sorry equal is here. try >= not > , comment with results.
            {
                vector<int> v;
                for(int j = 0; j < right+1; j++) // and here
                {
                    v.push_back(lines[j]); // and here
                }
                cout << v.size() << endl;
            }
        }
于 2013-11-06T22:20:15.890 に答える
0

あなたのアイデアを別の方法で考えてみてください:
p (parts) = 3, size = 11, ceil(11/3) = 44+4+3 = 11

他の場合も同じな p = 6, size = 200 ceil(200/6) = 34ので、34+34+34+34+34+30 = 200

int p = 6;
size_t nLimit = ceil((double)lines.size()/p);
// if you don't want to contain the leftover element within p elements, use floor
vector<int>::iterator start = lines.begin();
for(size_t i = 0; i < lines.size(); i+=nLimit){
    // Just use the constructor/insert function
    vector<int> v(start+i, start+std::min<size_t>(i+nLimit, lines.size()));
    cout<<v.size()<<endl;

}

ここの作業コード: http://ideone.com/6V7rSX

于 2017-06-23T11:12:17.933 に答える