STL算法库:

1、非修改式序列算法:不该懂容器中的元素次序和元素值,通过input迭代器和forward迭代器完成工作;(所以标准容器)

2、修改式序列算法:不直接容器中改变元素值,包含移除(逻辑)性质【不改变容器大小和元素个数】或删除性质算法,

3、排序和相关算法:包含多个排序函数和其他各种函数,包括集合操作等。不能以关联容器作为目标,因为关联容器元素被视为常数,不能变更

4、通用数字算法:包括区间的内容累积、内部乘积、小计、计算相邻对象差等函数;

1、非修改式序列算法

1.1、for_each 实现对区间[begin,end]中每个元素均调用进程op.

(1)、使用普通函数;

for_each(Iteratorbegin,iteratorend , proc op)

(2)、使用仿函数;

for_each(begin,end, Multiple<int>())

仿函数:就是一个类使用时对象调用函数,又称为函数对象。其实现类中包含函数operator(),这个类就有了类似函数的行为。是

stl六大组件(容器,配置器,迭代器,算法,配接器,仿函数)之一。

eg:

class Multiple {
private:
    T value;
public:
    Multiple(const T & t) :value(t){}
    void operator()(T& elem) const{
        elem *= value;

    }
};


(3)、for_each()返回值

template<class InputIt,class UnaryFunction >

UnaryFunctionfor_each( InputItfirst, InputItlast, UnaryFunction f );

eg:

class SUM{
private:
    long sum_d; 
public:
    SUM() :sum_d(0){}
    void operator()(int elem){
        sum_d += elem;
    }
    operator double(){
        return static_cast<double>(sum_d);
    }
};


for_each(begin,end, SUM())


1.2、元素计数:

count(Iteratorbegin,Iteratorend ,const

count_if(Iteratorbegin ,Iteratorend只有当op参数为真的时候,bool类型的返回值,才统计元素的个数

eg: op:bind2nd(greater<int>(),2)

1.3、最大值和最小值算法:


最小值算法:

Iterator min_element(Iterator beg,Iterator end)
Iterator min_element(Iterator beg, Iterator end, compFunc op)

最大值算法:

Iterator max_element(Iterator beg,Iterator end)
Iterator max_element(Iterator beg, Iterator end, compFunc op)


eg:


bool Absless(int elem1,int elem2){
    return abs(elem1) < abs(elem2);
}
int main(){
    vector<int> v{ 34, 31, 44, 21, 35, 45 ,-23};
    vector<int>::iterator result = min_element(v.begin(), v.end());//最小值
    result = min_element(v.begin(), v.end(),Absless);//最小绝对值


}




1.4、搜寻算法:


方法1:

Iterator find(Iterator begin, Iterator end, const T& value)  //返回区间值为value的第一个元素
Iterator find_if(Iterator begin, Iterator end, UnaryPredicate op) //寻找op值为真的第一个元素
Iterator find_if_not(Iterator begin, Iterator end, UnaryPredicate op)      //寻找第一个是op返回false的元素

方法2:

//返回区间中“连续count个值为value”的序列的首位置,如果不存在,返回end

Iterator search_n(Iterator begin, Iterator end,Size count,constT& value)
//使用区间中的每一个元素和value的比较,返回区间中满足op为真的连续count个元素value的序列的开头位置,不满足返回end

Iterator search_n(Iterator begin, Iterator end,Size count,constT& value,BinaryPredicate p)

方法3:搜寻第一个子区间

//两个函数返回区间内和子区间完全匹配的子区间开头位置,找不到的话,返回end,若子序列为空,返回begin 

Iterator search(Iterator1 begin, Iterator1 end, Iterator2 searchchbegin, Iterator2 searchchend)
//2第二个函数在p为真的时候才执行。 

Iterator search(Iterator1 begin, Iterator1 end, Iterator2 searchchbegin, Iterator2 searchchend,BinaryPredicate p)

方法4:搜寻最后一个子区间

//1.返回区间【begin,end】中和【searchchbegin,searchchend】匹配的最后一个子区间的开头位置。搜索失败或空,返回end. 

Iterator find_end(Iterator1 begin,Iterator1,end ,Iterator2 searchchbegin , Iterator2 searchend)
//2.第二个函数只有在p为真的时候才有意义。
Iterator find_end(Iterator1 begin,Iterator1,end ,Iterator2 searchchbegin , Iterator2 searchend,BinaryPredicate p)

方法5:搜寻某些元素的第一次出现位置


//返回子区间[serachbegin,searchend]中任何元素在【begin,end】中出现的第一个位置,如果没有这样字的元素,返回end. 
Iterator find_first_of(Iterator1 begin, Iterator1 end,Iterator2 searchchbegin,Iterator2 searchchend)
//第二个函数只有在p为真的时候才有意义
Iterator find_first_of(Iterator1 begin, Iterator1 end,Iterator2 searchchbegin,Iterator2 searchchend, BiaryPredicate p)

方法6:搜寻两个连续相等的元素

adjacent_find(): 

//形式一
template<class ForwardIt>
ForwardIt adjacent_find(ForwardIt first, ForwardIt last)
//形式二
template<class ForwardIt, BinaryPredicate p>
ForwardIt adjacent_find(ForwardIt first, ForwardIt last,BinaryPredicate p)