前言

参考自:c++判断vector中是否存在特定元素的方法

vector并未提供确定某一元素是否存在或查找特定元素,但是STL算法提供了以下函数方便我们计算

函数与示例

注:示例均包含下列头文件并使用std命名空间

1
2
3
4
5
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

1. any_of

应用:判断容器中是否存在满足期望的特定元素

参数:any_of包含三个参数,第一第二分别是容器的起始位置和结束位置,第三个参数为条件表达式

返回值:bool,1->存在满足期望的元素;0->不存在满足期望的元素

注意:any_of的第三个参数无法传入单个具体值,只能编写期望的条件表达式

实例

1
2
3
4
vector<int> num = {1, 3, 6, 2, 4};
int i;
if (any_of(num.begin(), num.end(), [] (int i) {return i > 1;})) // 判断容器中是否存在大于1的元素
cout << "number exists" << endl;

应用:对于从小到大排列的容器判断指定元素是否存在

参数:binary_search包含三个参数,第一第二分别是容器的起始位置和结束位置,第三个参数为指定元素

返回值:bool,1->指定元素存在;0->指定元素不存在

注意:使用该函数前必须保证容器中的元素从小到大进行排列

实例

1
2
3
4
5
6
7
8
9
10
vector<int> num = {1, 3, 6, 2, 4};
int i;

sort(num.begin(), num.end()); // 从小到大排列num
i = binary_search(num.begin(), num.end(), 4); // 判断容器中是否存在4
cout << i; // 1->4存在;0->4不存在

sort(num.begin(), num.end(), greater<int>()); // 从大到小排列num
i = binary_search(num.begin(), num.end(), 4); // 判断容器中是否存在4
cout << i; // 1->4存在;0->4不存在

注:对于sort函数不熟悉可以查看c++ sort函数

3. std::count

应用:计算指定元素的个数

参数:std::count包含三个参数,第一第二分别是容器的起始位置和结束位置,第三个参数为指定元素

返回值:指定元素的个数,不存在则返回0

注意:要么使用std命名空间,要么使用std::count

实例

1
2
3
4
vector<int> num = {1, 3, 6, 2, 4, 4};
cout << "4的个数为: " << count(num.begin(), num.end(), 4) << endl;
if (!count(num.begin(), num.end(), 8))
cout << "number not exists! " << endl;

4. std::find

应用:判断指定元素是否存在

参数:std::find包含三个参数,第一第二分别是容器的起始位置和结束位置,第三个参数为指定元素

返回值:指定元素的迭代器,如果不存在返回容器最后一个元素的下一个位置的迭代器(即num.end())

注意:如果查找的元素不存在返回的是容器名.end(),如果查找元素不存在的话不可以打印*迭代器,否则会导致程序崩溃

实例

1
2
3
4
5
6
vector<int> num = {1, 3, 6, 2, 4};
vector<int>::iterator i, j;
i = find(num.begin(), num.end(), 10);
if (i == num.end())
cout << "number not exists! " << endl;
j = find(num.begin(), num.end(), 4);

5. std::find_if

应用:获取满足条件的元素集合的第一个元素的迭代器

参数:std::find包含三个参数,第一第二分别是容器的起始位置和结束位置,第三个参数为条件表达式

返回值:满足条件的元素集合的第一个元素的迭代器,如果不存在满足条件的元素则返回容器最后一个元素的下一个位置的迭代器(即num.end())

注意:如果查找的元素不存在返回的是容器名.end(),如果查找元素不存在的话不可以打印*迭代器,否则会导致程序崩溃

实例

1
2
3
4
vector<int> num = { 1, 3, 6, 2, 4, 4 };
vector<int>::iterator i;
i = find_if(num.begin(), num.end(), [](int j) {return j > 3 and j < 5;});
cout << *i;

小结

  • 对于从小到大排好序的vector,使用binary_search
  • 仅判断是否存在某元素,使用find
  • 需要某元素总个数时,使用count
  • 支持复杂条件的查找时,使用any_of判断元素是否存在,使用find_if获取满足条件的元素集合的第一个元素的迭代器