使用find()查找向量中的元素

时间:2011-01-03 05:59:57

标签: c++ vector find

我有一个存储一些整数的向量。在该向量中,可以存在除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;
}

哪个有效。有一个更好的方法吗?特别是,由于向量可以包含任意数量的元素,可以有任何缺点吗?

4 个答案:

答案 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条件中添加另一个语句,你可能会引入一个非常难以调试的错误。