【问题标题】:Split a vector into n sub vectors (rebound)将一个向量拆分为 n 个子向量(反弹)
【发布时间】: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,表示 chunksub-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 &lt; size - right,然后你只需设置right = size - i就可以了。
  • 但是您是从i 的下一个值开始每个向量,对吧?你不想在你的外循环中使用i += right 之类的东西吗?
  • 不应该是right = size - i; 在你的else 中而不是你的if 中吗? :-)

标签: c++ arrays vector split


【解决方案1】:

换个方式思考你的想法:
p (parts) = 3, size = 11, ceil(11/3) = 4 所以 4+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

【讨论】:

    【解决方案2】:
    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;
                }
            }
    

    【讨论】:

    • 您编辑得对。之前的问题 (i) 作为所有循环的计数器。对吗??
    猜你喜欢
    • 1970-01-01
    • 2021-11-21
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    相关资源
    最近更新 更多