STL中有很多算法,这些算法可以用到一个或多个STL容器(因为STL的一个设计思想是将算法和容器进行分离),也可以用到非容器序列比如数组中。众多算法中,查找算法是应用最为普遍的一类。
使用STL的Vector时,利用函数 max_element,min_element,distance可以获取Vector中最大、最小值的值和位置索引:
代码如下:
#include <algorithm>
#include <iostream>
int main()
{
std::vector<double> v {1.0, 2.0, 3.0, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0, 5.0};
std::vector<double>::iterator biggest = std::max_element(std::begin(v), std::end(v));
//or std::vector<double>::iterator biggest = std::max_element(v.begin(), v.end);
std::cout << "Max element is " << *biggest<< " at position " <<std::distance(std::begin(v), biggest) << std::endl;
//另一方面,取最大位置也可以这样来写:
//int nPos = (int)(std::max_element(v.begin(), v.end()) - (v.begin());
//效果和采用distance(...)函数效果一致
//说明:max_element(v.begin(), v.end()) 返回的是vector<double>::iterator,
//相当于指针的位置,减去初始指针的位置结果即为最大值得索引。
auto smallest = std::min_element(std::begin(v), std::end(v));
std::cout << "min element is " << *smallest<< " at position " <<std::distance(std::begin(v), smallest) << std::endl;
}
输出:
Max element is 5 at position 4
min element is 1 at position 0
当然还有求和
为了对vector中的所有元素求和,我们利用accmulate这个函数。
头文件#include <numeric>。
int num=accumulate(va.begin(),va.end(),0); //求和
单个元素查找
1、 find() 比较条件为元素是否相等的查找:
1 2 |
|
2、find_if() 自定义比较函数
从给出的区间中查找第一个满足比较函数的元素
1 2 3 4 5 |
|
3、count() 统计元素出现的次数
std::count() 统计区间中某个元素出现的次数
std::count_if() 自定义比较函数
4、min_element() 查找给定区间内最小值
5、max_element() 查找给定区间内最大值
6、binary_search() 有序区间的二分查找
binary_search() 用来在一个有序区间中使用二分法查找元素是否在这个区间中,该算法的返回值为bool表示是否存在。
1 2 3 4 5 6 |
|
7、lower_bound() 返回有序序列给定区间[first, last) (左闭右开)内的第一个大于等于value的位置。如果所有元素都小于value,则返回last。
1 2 3 4 5 |
|
8、upper_bound() 返回有序序列给定区间[first, last) (左闭右开)内的第一个大于value的位置。如果所有元素都小于等于value,则返回last。
1 2 3 4 5 |
|
其中lower_bound/upper_bound 可以用于任何支持随机访问的容器中,比如vector,deque,数组。对于不支持随机访问的容器如 set/map,这些容器有同名的方法来进行 lower_bound/upper_bound 操作。
1 2 3 4 |
|
区间查找(区间整体匹配)
1、search() 查找子区间首次出现的位置
find() 用来查找单个元素,search() 用来查找一个子区间,比如 从myvector中查找自取件[20, 30] 的位置
1 2 3 4 |
|
search() 支持自定义比较函数,比如查询给定区间中每个元素比目标区间小1的子区间:
1 2 3 4 5 6 7 8 9 |
|
2、find_end() 查找子区间最后一次出现的位置
search()查找子区间第一次出现的位置,而find_end() 用来查找子区间最后一次出现的位置,find_end()支持自定义比较函数。
3、equal() 判断两个区间是否相等
4、mismatch() 查询两个区间首次出现不同的位置
集合查找(集合内任意一个元素匹配)
find_first_of() 查找给定集合中的任意一个元素
参考:https://blog.youkuaiyun.com/leonardohaig/article/details/81484372