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)