count specific number of elements
例如,如果我有一个由5个输入元素组成的数组,如果一个变量中已经建立了一个特定值,我如何计算该值被输入的次数。
如果click被定义为4,那么如何计算数组中使用click的次数?希望这是有道理的。谢谢
当你把你的问题标记为C++时,这里是一个正确的C++答案,使用STL。
1
| int num = std::count(&array[0], &array[5], click); |
请参阅http://en.cppreference.com/w/cpp/algorithm/count
- 嗯,&array[5]是真的有效吗?我知道,推迟和使用的地址可能会导致不明确的行为(如,&(*(array + 5)))。
- @奥利:你为什么不用array+5代替&array[5]?即。。。int num = std::count(array, array+5, click);
- 是,&;array[5]应对5元素数组有效。对于大小为n的数组,有编号为0到n-1的元素,但元素n的地址是有效的地址,即使访问该元素会给出未定义的行为。
- @aat:如果元素n的地址是有效地址,那么为什么访问该元素会给出未定义的行为?对此有什么解释吗?
- @康拉德:当然是惯用语。C99标准引用(我没有C++标准):"如果结果指向一个数组对象的最后一个元素,它将不被用作被评估的一元*运算符的操作数。"(65.6/ 8)在此上下文中,我不认为它是被评估的。
- @纳瓦兹:例如,它可能是另一个变量正在使用的内存位置。或者可能不会。C++标准只是保证您可以在任何2个数组元素和仅在数组末尾的概念元素之间执行指针运算。
- @奥利:地址操作符&是一元操作符,也就是说,根据您引用的c99报价,&array[5]调用未定义的行为。另外,&array[5]相当于&(*(array+5)),它使用另一个一元运算符*。
- @aa我不知道这一点,但它在这里并不相关:oli不仅仅是在处理元素,他是在使用[]取消引用它。我知道一个事实,我的代码(&*(a + 5)导致了VC++的至少一个最新(6.0之后)版本的调试器抱怨访问无效。所以,不管它是否合法,它并不总是有效的。因为我认为C数组的a[b]严格等同于*(a + b),这意味着oli的代码也会出现同样的问题。
- 康拉德:我相信C++委员会想要这个,你的例子是允许的。如果你遵循链接,你会发现一个很好的讨论。值得注意的是,他们说"p=0;*p;"只有在左值到右值转换时才是一个错误。open-std.org/jtc1/sc22/wg21/docs/cwg_active.html 232。当然,这个问题仍然是公开的,所以标准还没有明确说明这一点。
- @aat:指针上的算术不会调用未定义的行为,但会取消对它的引用。
- 我同意康拉德的观点,虽然做array + 5是完全好的,但做array[5]是完全不好的,即使只是应用操作员的地址来获得等价物。在大多数情况下,它将被编译器优化掉(&*(array+5)将被编译器转换为array+5,从而产生某种预期的未定义行为,但它仍然是未定义行为。另一个例子是,如果数组包含用户定义的类型T,而不是int,那么它可以在不属于T的内存区域上重载T::operator&。本标准不作例外,为UB。
- @大卫:最后一点关于用户定义类型和重载T::operator &是好的。
- @大卫(以及其他声称UB的人):至少根据实际编写标准的人,他们不认为这绝对是UB(open-std.org/jtc1/sc22/wg21/docs/cwg-active.html 232)。重要的一句话是:"我们一致认为标准中的方法似乎是正确的:p=0;*p;本质上不是一个错误。"
- 我认为,当一帮高代表这样的用户阅读标准和正在进行的争论,在性病委员会不能同意某项技术是否真的有效,有一个很好的机会,代码将更好地不使用说的技术。(即使它应该是安全的,难道不是有些编译器编写人员弄错了吗?)
- 哦,还有一个无耻的塞子:用这些。他们肯定做得对,你可以一次又一次地忘记这个问题。(我相信C++ 11会有EDOCX1,0 e/eDCOX1,1的方块,BTW.)
- @康拉德,@nawaz,@aat,@david,@sbi:为了使讨论正式化,我创建了一个关于这个主题的问题:stackoverflow.com/questions/5975586/…。哦,不!删除!这是stackoverflow.com/questions/988158的副本,似乎表明它是有效的。
- @奥利-谢谢你找到了另一个问题,让我们一起去读它,而不是在这里扩展讨论!@康拉德,@nawaz--&array[5]肯定不是我所提倡的,但我认为这显然是合法的。(@sbi——我非常同意你的看法。)
你可以使用count。
类似的事情(抱歉我没有练习C++):
1 2 3 4 5 6 7
| #include
void someFunction() {
int input[5];
// initialize input with some values
int num = std::count(&input[0], &input[5], 4);
} |
这就是使用C样式数组的方法。
1 2 3 4 5 6 7
| int i;
int count = 0;
for(i = 0; i < ARRAYSIZE; ++i)
{
if(array[i] == click)
++count;
} |
array size是静态分配数组的大小,array是数组变量,单击要查找的值。在count中,保存变量的计数。
如果没有排序,那么线性搜索是您唯一的选择。