四、c++中的算法
标签(空格分隔): c++STL
简介
1.stl的算法一般采用“覆盖(overwrite)”模式而不是“安插(insert)”模式。调用时目标区间必须拥有最够的元素空间。
2.可以传递自定的函数
函数设计的通用:
- 使用模板了提供通用类型
- 使用迭代器访问容器
算法库:
- 非修改式序列算法:不改动容器中元素的次序和值,一般通过input迭代器和forward迭代器完成工作;
- 修改式序列算法:一般不直接更改元素值或者在复制到另一区间的过程中改变元素值,此算法还包括溢出性质和删除性质的算法。移除一般只是在逻辑上“移除”元素,不改变容器大小和容器中的元素个数。“移除”和“删除”是不同的算法。
- 排序和相关算法:包含多个排序函数和其他各种函数,包括集合操作等。不能以关联容器作为目标,因为关联容器元素被视为常数,不能变更。
- 通用数字算法: 一般包括将区间的内容累计,内部乘积,小计,计算相邻对象差等函数。
1.非修改序列算法
不需要使用循环而从序列中寻找出某些东西的基本工具。不会改变序列次序和元素值。
- for each 算法
- 元素计数算法
- 最小值和最大值算法
- 搜寻算法
- 区间比较算法
1.for each算法
定义:
for_each(Iterator begin, iterator end , proc op)
for_each 实现对区间[begin,end]中每个元素均调用进程op.
1.最普通的使用for_each算法
template<class T>
void InsertValue(T & vec, int first, int last){
if (last > first){
for (int i = first; i < last;++i)
vec.insert(vec.end(), i);
}
else
{
cout << "last<first!" << endl;
}
}
void printItem(int elem){
cout << elem << " ";
}
int main(){
vector<int > vec;
InsertValue(vec, 1, 10);
for_each(vec.begin(),vec.end(), printItem);
cout << endl;
}
输出结果为:
1 2 3 4 5 6 7 8 9
2.for_each 中使用仿函数
仿函数:就是一个类使用时对象调用函数,又称为函数对象。其实现类中包含函数operator(),这个类就有了类似函数的行为。是stl六大组件(容器,配置器,迭代器,算法,配接器,仿函数)之一。
接下来使用自定义仿函数:Multiple<T>()
for_each(begin,end, Multiple<int>())
例子:
template<class T>
void InsertValue(T & vec, int first, int last){
if (last > first){
for (int i = first; i < last;++i)
vec.insert(vec.end(), i);
}
else
{
cout << "last<first!" << endl;
}
}
void printItem(int elem){
cout << elem << " ";
}
template<class T>
class Multiple {
private:
T value;
public:
Multiple(const T & t) :value(t){}
void operator()(T& elem) const{
elem *= value;
}
};
int main(){
vector<int > vec;
InsertValue(vec, 1, 10);
for_each(vec.begin(),vec.end(), printItem);
cout << endl;
for_each(vec.begin(), vec.end(), Multiple<int>(2)); //每个元素乘以2
for_each(vec.begin(), vec.end(), printItem);
cout << endl;
}
结果为:
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3.for_each的返回值
函数原型为:
template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );
例子:
template<class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
{
for (; first != last; ++first) {
f(*first);
}
return f;
}
例子:
//前面的部分省略
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);
}
};
int main(){
vector<int > vec;
InsertValue(vec, 1, 10);
for_each(vec.begin(),vec.end(), printItem);
cout << endl;
for_each(vec.begin(), vec.end(), Multiple<int>(2)); //每个元素乘以2
for_each(vec.begin(), vec.end(), printItem);
cout << endl;
double sum = for_each(vec.begin(), vec.end(), SUM());
cout << "sum: "<<sum<<endl;
}
输出结果为:
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
sum: 90
2.元素计数算法
求元素的总个数。
函数形式为:
count(Iterator begin, Iterator end ,const T& value)
count_if(Iterator begin ,Iterator end ,UnaryPredicate op)
说明:
1.在区间中统计值为value的个数
2.只有当op参数为真的时候,bool类型的返回值,才统计元素的个数。
例子:
#include <algorithm>
#include <iostream>
#include <vector>
int main()
{