C++ 计数非重复发生
从以上两个数组中,我要做的是计算数组中不同数字的出现次数C++ 计数非重复发生,c++,arrays,C++,Arrays,从以上两个数组中,我要做的是计算数组中不同数字的出现次数num2。不同出现的次数取决于数组num3 例如:在num3[16]中,第一个元素[0]是1010,在数组num1的第8个位置,元素1010是相同的。因此,我们必须为元素1010计算num2中不同数字的出现次数。 因此,对于num3中的1010元素,num2中出现的不同数字是6。num2中的这些不同数字是100101102103104105 对于num3中的下一个条目,它必须是与第一个条目(1010)不同的数字。因此,对于num31015中
num2
。不同出现的次数取决于数组num3
例如:在num3[16]
中,第一个元素[0]是1010
,在数组num1
的第8个位置,元素1010
是相同的。因此,我们必须为元素1010
计算num2
中不同数字的出现次数。
因此,对于num3
中的1010
元素,num2
中出现的不同数字是6。num2
中的这些不同数字是100101102103104105
对于num3
中的下一个条目,它必须是与第一个条目(1010)不同的数字。因此,对于num3
1015中的相应数组元素,num2
中的总差异项为2。它们是num2
数组中的=106107
如果我在计算相同数量的事件,我可以像这样轻松地完成:
int num2[ ]={100,101,101,102,103,104,104,105,106,106,106,107,107,108,108,108,108,109,109,110};
int num3[ ]={1010,1010,1010,1010,1010,1010,1010,1010,1015,1015,1015,1015,1015,107,107,107,107,107,107,107};
#包括
使用名称空间std;
int main()
{
int num2[]={100101101102103104104105106106107108109110};
int n=sizeof(num2)/sizeof(num2[0]);
CUT< P>我起草了许多可能的解决方案之一。我使用C++而不是C,所以没有简单的C风格数组。但是,使用的算法当然也适用于C样式数组。
请注意:您的输入数据错误。您创建了一个包含16个值的数组,但初始值设定项列表的长度为20个值
我正在使用std::vector
作为解决方案
首先,我们从开始到结束迭代num3。我们将初始“开始”-索引设置为0。然后,我们将第i个元素与第i+1个元素进行比较。只要它们相等,我们就增加i-索引。如果找到下一个不相等的值,则i具有新的不同值的索引
为了计算num2中的不同值,我们使用了一个特殊属性std::set
,std::set
只能包含唯一或不同的值。因此,我们尝试将num2中的所有值放入std::set
。但只添加不同的值。已经在std::set
中的值将被丢弃。We具有“start”和“i”,并使用std::set
的范围构造函数填充它
为了得到结果,我们只需要使用size()
函数对std::set
中的元素进行计数
最后,我们设置了一个新的开始值,然后继续。简单的解决方案,但有效
请参阅:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int num2[]={100,101,101,102,103,104,104,105,106,106,106,107,107,108,108,108,108,109,109,110};
int n = sizeof(num2) / sizeof(num2[0]);
cout << "Number of times 101 appears : "
<< count(num2, num2 + n, 101);
return 0;
}
#包括
#包括
#包括
#包括
#包括
std::向量num2{100101101102103104104105106106107108109110};
std::向量num3{1010101010101010101010101010101010151015101510151015107107};
int main(){
//检查向量的大小是否足够
如果(num2.size()>=num3.size()){
//初始开始值。我们将在num3的开始处搜索
大小\u t开始{0};
while(开始 STD::Cube考虑<代码> STD::“代码< >代码> STD::UNIQUIGORION < /COD>删除重复出现,然后<代码> STD::计数< /COD>计数发生。当然,如果您只考虑一个值,也没有办法处理它,如果没有代码的预处理步骤:STD::唯一的< /代码>代码>包括使用命名空间STD;< /代码> -不做。永远不要这样做。你取决于一个特定的实现头是否可用,它是一个包含所有内容的头,然后你添加了“使用命名空间std”现在所有的好名字都在使用中。请,请不要在生产代码中这样做。甚至在测试代码中也不要这样做。哇,我在结束前4分钟回答了。自从引入了新的结束规则,人们必须在圣杯守护者拍摄之前快速回答…我看到这里的规则非常严格。我修正了数组大小e、 我希望国旗会被撤掉。
#include <algorithm>
#include <vector>
#include <set>
#include <iterator>
#include <iomanip>
std::vector<int> num2{ 100,101,101,102,103,104,104,105,106,106,106,107,107,108,108,108,108,109,109,110 };
std::vector<int> num3{ 1010,1010,1010,1010,1010,1010,1010,1010,1015,1015,1015,1015,1015,107,107,107,107,107,107,107 };
int main() {
// Check for sufficent sizes of the vector
if (num2.size() >= num3.size()) {
// Initial start value. We will search at the begin of num3
size_t start{ 0 };
while (start < num3.size()) {
// Set i = equal to current start value. So, search at the beginning of the next unequal number
size_t i{ start };
// Find the next non matching value
while (i < (num3.size() - 1) && (num3[i] == num3[i + 1])) ++i;
// Copy all values from num 2 in a std::set, which can only contain distinct values
std::set<int> values(std::next(num2.begin(), start), std::next(num2.begin(), i));
// Print result. Show number of distinct values
std::cout << "\n" << std::setw(2) << values.size() << " -> " << std::setw(5) << num3[i] << " --> ";
std::copy(values.begin(), values.end(), std::ostream_iterator<int>(std::cout, " "));
// Evaluate next identical values from num3
start = ++i;
}
}
else std::cerr << "\n***** Error: num2 too short\n";
return 0;
}