【STL】<algorithm><numeric><functional> 中的常用算法

16 篇文章 0 订阅

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/



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值