四、c++中的算法--非修改序列算法(非变易算法)

四、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()
{
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值