【STL】<algorithm><numeric><functional> 中的常用算法
2014-04-09 16:23
579 查看
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/
相关文章推荐
- C++库常用函数一览(<string><cctype><algorithm><cmath><cstdlib><iomanip><numeric>)
- [C++STL]算法<algorithm>中各种算法解析
- 【C++ STL】算法 <algorithm>中各种算法解析
- C++库常用函数一览 :<string> <cctype> <algorithm> <cmath> <cstdlib> <iomanip> <numeric>
- 【C++ STL】算法 <algorithm>中各种算法解析 分类: C/C++ 数据结构与算法 2015-07-07 21:37 22人阅读 评论(0) 收藏
- 【C++ STL】算法 <algorithm>中各种算法解析
- 【C++ STL】算法 <algorithm>中各种算法解析
- [C++STL]算法<algorithm>中各种算法解析
- 【C++ STL 温故而知新 002】<algorithm>中各种算法解析和string类
- 【转】STL算法 <algorithm>中各种算法解析
- 【C++ STL】算法 <algorithm>中各种算法解析
- 【C++ STL】算法 <algorithm>中各种算法解析
- STL-<algorithm>常用函数
- STL数值算法<numeric>
- STL 算法 <algorithm>中各种算法解析
- 【C++ STL】算法 <algorithm>中各种算法解析
- 常用算法思想复习之<递归与分治>
- 算法之旅,直奔<algorithm>之一 all_of
- #include<algorithm>中的sort算法
- 算法之旅,直奔<algorithm>之十五 find