如何检查数组是否包含唯一值

5

我想检查数组中的所有value

// if the value (unique) is present in an array then do something
if (value == array[size])

这个能不能在一个语句中完成,而不需要调用函数或基本的for循环语句?

2
结果应该是什么,无论其中一个元素是值还是它们全部都是值? - Matthew Flaschen
3个回答

5

std::find可以在一条语句中完成,但这并不像其他语言那样简单 :(

int array[10];
if (end(array) != find(begin(array), end(array), 7)) {
  cout << "Array contains 7!";
}

或者使用std::count函数:
if (int n = count(array, end(array), 7)) {
  cout << "Array contains " << n << " 7s!";
}

1
整洁,但为什么要把简单的事情复杂化呢?这并没有带来任何好处(无论是性能还是可读性)。 - Ramadheer Singh
3
@Gollum,OP要求一句话概括,我已经给出了。 ;) 我个人不会在处理数组时使用这种方法。使用其他容器或contains辅助函数更简单。 - Stephen
3
@Gollum,这个C++难懂吗?你建议将这个find()调用分散到多行中吗? - catchmeifyoutry
唯一可能被认为是“复杂”的是迭代器的构造方式,可以通过使用 Boost.Range 的实用函数 begin()/end() 来改进,或者意图不够清晰,在这种情况下可以使用一些 contains() 实用函数。 - Georg Fritzsche
不要因为你不喜欢一种方案就投下反对票。这是对OP提出的问题的答案,而且它并没有错。 - Stephen
显示剩余2条评论

4

根据问题的不同,您可能需要使用 set。它有一个名为count()的成员函数,可以告诉您集合中是否存在某个元素:

if(myset.count(value) > 0){
    doThings();
}

如果你只是想知道它是否出现了一次或多次: if(myset.find(value) != myset.end()) { /*太好了!*/ } - Anthony
@Duracell,集合不能有重复项,因此set.count返回1或0。两个版本是等价的。 - Matthew Flaschen
@Matthew,没错。我想这只是一种习惯,因为我使用std::map::find的方式也是一样的。 - Anthony
@Duracell,如果你使用允许重复的集合,你仍然可以使用count。 - Brendan Long

2

没有内置的运算符可以完成这样的操作。

有许多方法可以执行测试,看起来从外部来看似乎是一个单一的语句。其中一些方法使用标准库已经提供的部分,因此您不必自己编写太多代码。然而,它们不可避免地会在某个时刻使用某种形式的函数调用和/或循环,这些都是您已经排除的。

因此,考虑到您问题中的限制:不,没有任何方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接