首页 > 解决方案 > 如何在向量中的某个数字之后重新计算进程

问题描述

假设我有很多年。

int year[20];

该计划是创建一个 if 条件并使用 year 向量中的一部分月份。

我想合作的部分是从九月到二月。因此,我一直想选择的年份范围是(year >=9 && year <3)

因此我有两个向量。一个是年份,另一个是我计算的条目。

例如:

vector <int> year{1,2,3,5,10,2,10,12,11,12,2,2,3,5,8,2,8,12,8,12};
vector <int> list{1,2,3,2,1,1,2,3,2,1,5,3,2,5,6,5,3,2,5,6};

上述两个向量的大小都是 20。我想要做的是计算list我正在研究的每一年段中的向量条目。

如果我们查看上面的两个向量,向量中的第一个月段year将是:从 year[0] =1 到 year[1] =2。计数为 2。

下一段将是:从 year[4] =10 到 year[5] =2。所以打印出的条目将来自向量list: list[4]=1, and list[5] =1.并且总数为 2。

段工作完成后,我想将计数重新分配为零以再次启动它并遍历整个向量year

这是我做的一些工作。我的问题是,我可以在 if 语句中创建段,但我试图在每年段完成时分配计数 =0。

#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>
using namespace std;
int main()
{
    unsigned int count =0;
     vector <int> year{1,2,3,5,10,2,10,12,11,12,2,2,3,5,8,2,8,12,8,12};
    vector <int> list;

    for (int x =0; x<20; x++)
    {
        //cout << "random number" << (1+ rand()%12)<< endl;
        list.push_back((1+ rand()%4));
    }

    for (int j=0; j<=20; j++)
    {
        if (year[j] >=9 && year[j]<3)
        {
            count++;
            cout <<list[j]<< "counting the entry of each segment"<< count<<endl;
        }
    }
}

year如果向量中的条目(例如 1 = 一月,2 = 二月)满足九月到二月的条件,我想选择段的方式。因此,每个段都将大于或等于 9 且小于 3。
当我递增到 vectoryear时,我找到了一个满足条件的段并转到下一个再次满足条件的段。

每次我在每个段的 if 条件下完成操作时,我都想分配 count = 0,这样我就可以重新计算下一段中有多少条目。

由于月份按升序排列,因此示例 {11, 10} 将计为 1,其中包含两个段而不是两个段。段将是 {11} 和 {10},而不是 {11, 10},它计算元素 entry = 2。

标签: c++vectorcount

解决方案


我建议看(year[j]+9)%12而不是直接看year[j]
所有 >= 6 都在您的范围内 (6,7,8,9,10,11) ,即不需要的其他 6 个月 (0,1,2,3,4,5) 都在外面。这也使得检测新段的开始变得更加容易。

year[j]  (year[j]+9)%12    wanted
 1       10                 x
 2       11                 x
 3        0
 4        1
 5        2
 6        3
 7        4
 8        5
 9        6                 x
10        7                 x
11        8                 x
12        9                 x

向量中的值变为:

          wanted   reset
 1  10    x        
 2  11    x
 3   0             r
 5   2
10   7    x    
 2  11    x
10   7    x        r
12   9    x
11   8    x        r
12   9    x
 2  11    x
 2  11    x
 3   0             r
 5   2
 8   5
 2  10    x
 8   5             r
12   9    x
 8   5             r
12   9    x

这显示了您要重置计数并开始处理新段的位置,即只要(year[j]+9)%12不大于先前的索引。

该公式(year[j]+9)%12通过移动您正在查看的“虚拟月份”、使用+9部件并确保结果在 12 个月内仍处于 0-11 范围内来起作用%12。即“1”(被视为“10”)被视为高于“12”(被视为“9”)。所以从 12 (9) 到 1 (10) 不会触发重置,但从 2 (11) 到 3 (0) 会触发重置,因为该段显然结束了。同样从 2 (11) 到 10 (7) 触发重置;这是必需的,因为 (3-8) 发生在两者之间,因此需要开始一个新的段,即使 10 高于 2。


推荐阅读