c++ - 如何在 vector 中的某个数字之后重新计算一个过程

标签 c++ vector count

假设我有一系列年份。

int year[20];

计划是创建一个 if 条件并处理年份 vector 中的月份部分。

我想合作的 segmentation 市场是从 9 月到 2 月。因此,我一直想选择的年份范围是 (year >=9 && year <3)

因此我有两个 vector 。一个是年份,另一个是我数数的时候。

例如:

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};

上面两个 vector 的大小都是20。我想做的是计算来自list的 vector 条目。在我正在研究的每一年中。

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

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

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

这是我做的一些工作。我的问题是,我可以在 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;
        }
    }
}

如果 vector year 中的条目,我想选择段的方式例如,1=一月,2=二月满足九月到二月的条件。所以每个段将大于或等于 9 且小于 3。
随着我递增到 vector year ,我找到一个满足条件的段,然后转到下一个再次满足条件的段。

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

由于月份按升序排列,从示例 {11, 10} 将计为 1,有两个段而不是两个。段将是 {11} 和 {10},而不是 {11, 10},它计算元素条目 =2。

最佳答案

我建议看(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

vector 中的值变为:

          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部分。 IE。 “1”(被视为“10”)被视为高于“12”(被视为“9”)。因此,从 12 (9) 到 1 (10) 不会触发重置,但从 2 (11) 到 3 (0) 会触发重置,因为该段显然结束了。同样从 , 2 (11) 到 10 (7),触发重置;这是必需的,因为 (3-8) 出现在两者之间,因此需要开始一个新的段,即使 10 高于 2。

关于c++ - 如何在 vector 中的某个数字之后重新计算一个过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59573778/

相关文章:

c++ - 为什么正则表达式在 C++ 的日语字符串中找不到 "("?

c++ - Rapidjson 查找成员

swift - SKSpriteNode 沿向量移动

c++ - 使用作为对 vector 元素的引用的参数调用 c++ 函数

java - vector 中参数的匹配

mysql - 使用mysql查询基于不同组获取product_id列的不同计数

C++写访问冲突

c++ - 在派生类型的对象上从基类调用虚方法

java - 计算 ArrayList 中单词的出现次数

java - 计算 String 中的字符不适用于制表符 ('\t' )。我使用错误的方法吗?