C++: 08. Общие алгоритмы, функторы (функциональные объекты), bind1st и bind2nd

Лучшая рекомендация — перепечатать цитируемый пост в блоге (объяснение очень подробное): https://www.cnblogs.com/ne-liqian/p/7889631.html        .

Общий алгоритм:

Общие алгоритмы — это некоторые алгоритмы, определенные в библиотеке STL.Эти алгоритмы могут использовать интерфейс для работы с различными типами данных , поэтому они становятся общими алгоритмами.

Общие алгоритмы полагаются только на работу итераторов, а не на контейнеры.

Заголовочные файлы: #include <алгоритм> и #include <числовой>.

 Обычно используемые общие алгоритмы:

1、найти(начало,конец,значение);

Алгоритм поиска. begin to end — итератор диапазона поиска, value — значение, которое нужно найти, возвращаемое значение — это первый итератор, равный заданному значению, если не найдено, возвращает end.

int main()
{
    int target = 1;
    vector<int> vec;

    int array[4] = {1,2,3,4};

    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);

    if(find(vec.begin(), vec.end(), target) == vec.end())
        printf("not find\n");
    else
        printf("find\n");

    //查找一个数组
    if(find(&array[0], &array[3], target) == &array[3])
        printf("not find\n");
    else
        printf("find\n");
}

2、find_if(начало, конец, пред)

find_if(begin, end, pred): алгоритм поиска. Возьмите пользовательскую функцию поиска (третий параметр). Это означает, что pred (*iter) == true оценивается для каждого элемента выше от начала до конца, что означает, что текущий итератор возвращается, если он найден, и возвращается конец, если он не найден.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool isequal6(const int &v1)
{
    return (v1 == 6);
}

class isequal5
{  
public:   
    bool operator () (int& target) 
    {  
        return (target == 5);  
    }  
}; 

class isequal
{  
public:   
    isequal(int value):m_value(value){}
    bool operator () (int& target) 
    {  
        return (target == m_value);  
    }  

    int m_value;
}; 

int main()
{
    vector<int> vec1;

    vec1.push_back(1);
    vec1.push_back(5);
    vec1.push_back(6);
    
    使用自定义函数isequal6(参数时容器中使用迭代器遍历的每个元素)
    if(find_if(vec1.begin(), vec1.end(), isequal6() != vec1.end()))      
        printf("find\n");
    else
        printf("not find.\n");
    
    所谓的仿函数就是函数对象(类中有()运算符重载函数,此时该类定义的对象就可以当函数使用,函数使用的时候不就需要用()么)
    if(find_if(vec1.begin(), vec1.end(), isequal5() != vec1.end()))    //使用仿函数
        printf("find\n");
    else
        printf("not find.\n");

    if(find_if(vec1.begin(), vec1.end(), isequal(7) != vec1.end()))    //使用带参数的构造函数仿函数
        printf("find\n");
    else
        printf("not find.\n");

    return 0;
}

Функтор (функциональный объект): упоминается в приведенном выше коде. Боюсь, вы не видите красную метку.

Представляя find_if, давайте представим связыватель кстати : bind1st и bind2nd

bind1st : привязать первый параметр объекта бинарной функции operator()

bind2nd: привязать второй параметр объекта бинарной функции operator()

vector<int> vec = {1, 2, 2, 3, 4};
 
pos1 = find_if(vec.begin(), vec.end(), bind1st(less<int>(), 2));
cout << *pos1 << endl;
输出3    less<int>() 就是'<'二元操作  bind1st绑定第一个元素,可以理解为哦绑定在左边 2 < ?
         该函数的意思就是查找第一个比2大的元素


pos2 = find_if(vec.begin(), vec.end(), bind2nd(greater<int>(), 2));
cout << *pos2 << endl;
输出3    greater<int>() 就是'>'二元操作  bind2nd绑定第二个元素,可以理解为哦绑定在右边 ? > 2
         该函数的意思也是查找第一个比2大的元素

3、накапливать(начало,конец,начальное_значение)

Алгоритм суммы. begin to end — это итератор диапазона суммирования, а init_value — начальное значение суммирования. Это означает найти сумму предыдущего диапазона и, наконец, добавить init_value.

4, сортировка (начало, конец)

Алгоритм сортировки. Это сортировка, кроме того, может быть третий параметр, который может быть передан в пользовательскую функцию сравнения, или шаблон функции сравнения, который идет с stl.

把vec里面的元素按从大到小的序列进行排序
sort(vec.begin(), vec.end(), greater<int>());
	
默认排序方式:小到大
sort(vec.begin(), vec.end());
sort(vec.begin(), vec.end(),less<int>());

Существует множество других алгоритмов, которые мы не будем здесь описывать по одному.

Хотите увидеть нажмите: https://www.2cto.com/kf/201606/517445.html

おすすめ

転載: blog.csdn.net/qq_41214278/article/details/83830046