1. find
功能:从序列中找到第一个和 val 相等的元素
详细见:http://www.cplusplus.com/reference/algorithm/find/
1. 从 first 开始挨个和 val 比较,直至找到或者到达 last
2. 比较操作符是 "=="。因此对于自定义结构,需要重载 "=="操作符
重载的例子:
// find example
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
struct Person
{
int age_;
string name_;
};
bool operator==(const Person& left, const Person& right)
{
return (left.age_ == right.age_);
}
int main()
{
//Person target = { 29, "Francis" };
Person target = { 30, "Francis" };
Person arr[] = { { 19, "Alice" }, { 15, "Bob" }, { 29, "Mike" } };
Person* p;
// pointer to array element:
p = std::find(arr, arr + 3, target);
if (p != arr + 3)
{
std::cout << "array: " << p->name_ << '\n';
}
std::vector<Person> vec(arr, arr + 3);
std::vector<Person>::iterator it;
// iterator to vector element:
it = find(vec.begin(), vec.end(), target);
if (it != vec.end())
{
std::cout << "vector: " << it->name_ << '\n';
}
return 0;
}
2. count
功能:计算序列中和 val 相等的元素的个数
详细见:http://www.cplusplus.com/reference/algorithm/count/
原理基本和 find 相同,根据 "==" 查找,因此对于自定义结构,需要重载 "=="操作符
3. accumulate
功能:累积
template <class InputIterator, class T>
T accumulate (InputIterator first, InputIterator last, T init);
template <class InputIterator, class T, class BinaryOperation>
T accumulate (InputIterator first, InputIterator last, T init,
BinaryOperation binary_op);
init 为初始值,结果存 init 和返回
对于第一种形式:
(1) 默认为累积形式为 "+", 因此对于自定义结构,也可以重载操作符 "+"
对于第二种形式:
(2) 累积形式按 BinaryOperation binary_op 指定的方式,binary_op 有以下几种形式:
a. 函数
b. 重载调用操作符的对象:可以是自定义的,也可以是 STL 里提供的
例子见:http://www.cplusplus.com/reference/numeric/accumulate/
4. equal
template <class InputIterator1, class InputIterator2>
bool equal (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
bool equal (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred);
功能:逐个比较以 first1 和 first2 开始两个序列中的元素,看是否“相等”,直至 first1 序列到达 last1 (true)或者遇到不“相等”的元素(false)
说明:
(1) 2 个序列类型可以不同,只要能执行 "==" 操作(第一种形式)或 pred 操作(第二种形式)
对于第一种形式:
(2) 默认操作符为 "=="。因此对于不能用执行 "==" 的类型可以重载 "==" 操作符。
对于第二种形式:
(3) 同 accumulate 一样,pred 可以是函数,也可以是重载调用操作符的对象。
5. less,minus 等等
(1) 和其他函数不同的是, less,minus 并不是函数,而是类模板,它重载了函数调用操作符,我们称之为 "functor";
(2) 在 less 的函数调用操作符实现中,实际的操作是对元素进行 "<" 操作. 因此对于自定义结构,如果要使用 less, 必须重载 "<" 操作符。
(3) STL 容器中 less 为 priority_queue, map, multimap, set, multiset 的默认 comparator,对于复合类型来说,有2种选择:
a. 使用默认的 less, 对复合类型重载 "<", 这种方式代码可读性差,因为根本不知道谁在哪里调用重载操作符;
b. 【推荐】实现比较 functor 类名, 创建容器时传入,由于是显式传入的,代码可读性要好很多。
详细见:http://www.cplusplus.com/reference/functional/less/
6. lexicographical_compare
如果 [first1, last1) 按字典序列小于 [first2, last2), 返回 true, 否则返回 false.
lexicographical_compare 可以指定 comparator, 如果不指定,将使用默认的 "<", 因此对于复合类型,需要重载 "<" 操作符。
由于 STL 中容器的比较(两个容器之间的比较,不是指容器中两个元素的比较)都是采用 lexicographical_compare, 因此,如果容器的的元素是复合类型,因此容器元素需要重载 "<"(即使 map, set 等能指定 functor 类名或结构名).
注意:
对于函数而言(例如 lexicographical_compare, sort),comparator 可以是一个比较函数,也可以是一个 functor 对象的 "()" 操作符(实质上也是函数,即操作符函数);
对于容器来说,comparator 是一个 functor 类名。
具体实现见:http://www.cplusplus.com/reference/algorithm/lexicographical_compare/