我有一个存储一些整数的向量。在该向量中,可以存在除10,12,31之外的所有数字不能一起出现或成对出现,即10和12,10和31,12和31,10,12和31无效。我想出了以下方法:
int main(){
int a[] = {10,2,31}; //can be of any size
vector<int> v(a, a+3);
short cnt = 0;
if(find(v.begin(), v.end(), 10) != v.end())
++cnt;
if(find(v.begin(), v.end(), 12) != v.end())
++cnt;
if(find(v.begin(), v.end(), 31) != v.end())
++cnt;
if(cnt > 1)
cout<<"Invalid options";
else
cout<<"Valid options";
return EXIT_SUCCESS;
}
哪个有效。有一个更好的方法吗?特别是,由于向量可以包含任意数量的元素,可以有任何缺点吗?
答案 0 :(得分:4)
count
:
template <class InputIterator, class T>
typename iterator_traits<InputIterator>::difference_type
count ( ForwardIterator first, ForwardIterator last, const T& value );
(见http://www.cplusplus.com/reference/algorithm/count/)
或,count_if
(仅遍历列表一次):
template <class InputIterator, class Predicate>
typename iterator_traits<InputIterator>::difference_type
count_if ( ForwardIterator first, ForwardIterator last, Predicate pred );
需要谓词的一些额外工作,例如:
bool checkvalues(int i) {
return (i==10 || i==12 || i==31);
}
如果你想在运行时指定可能的值,你可能会更聪明并使用operator()
创建一个类。
(见http://www.cplusplus.com/reference/algorithm/count_if/)
关于无效对和三元组的问题是红鲱鱼吗?
答案 1 :(得分:2)
如果你对它们进行排序,那么你可以使用std::binary_search
,当向量中的元素数量很大时,它会运行得更快(虽然要有很大的差异,但需要非常大)。
std::sort(v.begin(), v.end());
if (std::binary_search(v.begin(), v.end(), 10)) cnt++;
if (std::binary_search(v.begin(), v.end(), 12)) cnt++;
if (std::binary_search(v.begin(), v.end(), 31)) cnt++;
答案 2 :(得分:0)
您可以尝试set_intersection
,如下例所示:
int a[] = {10,2,12}; //can be of any size
int b[] = {10,12,31}; // set we are interested in, sorted already to save a sort
sort (a, a+3);
vector<int> dest(sizeof(a)/sizeof(a[0])); // matching items will go here
vector<int>::iterator it;
it = set_intersection (a, a+3, b, b+3, dest.begin());
if (distance(dest.begin(), it) > 1) // oops means more than one item has matched...
答案 3 :(得分:-1)
即使语句只有1行,你也应该总是在if语句中使用括号。
if(find(v.begin(), v.end(), 31) != v.end())
++cnt;
如果没有方括号,读取代码会非常混乱。如果你想在if条件中添加另一个语句,你可能会引入一个非常难以调试的错误。