C++学习笔记38:算法简介

1 算法就是一个个函数模板,大多数在中定义
2 STL中提供能在各种容器中通用的算法,比如查找,排序等
3 算法通过迭代器来操纵容器中的元素。许多算法可以对容器中的一个局部区间进行操作,因此需要两个参数,一个是起始元素的迭代器, 一个时终止元素的后面一个元素的迭代器。比如查找和排序
4 有的算法返回一个迭代器。比如find()算法,在容器中找一个元素,并返回一个指向该元素的迭代器
5 算法可以处理容器,也可以处理普通数组
6 算法示例:find()

    template <class InIt, class T>
    InIt find(InIt first, InIt last, const T& val);
    -- first 和last这两个参数都是容器的迭代器,它们给出了容器中的查找区间起点和终点[first, last)查找等于val的元素
    -- 用 == 运算符判断相等
    -- 函数返回值是一个迭代器。如果找到,则该迭代器指向被找到的元素。如果找不到,则该迭代器等于last。
    例子(见本工程iterator3.cpp)
/**
 *      find()算法例子
 */
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    int array[10] = {10, 20, 30, 40};

    // 声明vector容器,并赋值
    vector<int> v;
    v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4);

    // 声明迭代器
    vector<int>::iterator p;
    // 查找容器v中元素3的迭代器指向的位置,并返回该迭代器
    p = find(v.begin(), v.end(), 3);
    if(p != v.end())
        cout << *p << endl; // 输出3

    p = find(v.begin(), v.end(), 9);
    if(p == v.end())
        cout << "not found" << endl;

    p = find(v.begin() + 1, v.end() - 2, 1);    // 整个容器:[1, 2, 3, 4],查找区间:[2, 3)  如果查不到  p的值是查找区间的终点
    if(p != v.end())
        cout << *p << endl;

    int* pp = find(array, array + 4, 20);   //数组名是迭代器
    cout << *pp << endl;

}



7 STL中 “大” “小” 的概念

    -- 关联容器内部的元素是从小到大排序的
    -- 有些算法要求其操作的区间是从小到大排序的,称为“有序区间算法”
        例如: binary_search
    -- 有些算法会对区间进行从小到大排序,称为“排序算法”
        例如:sort
    -- 还有一些其他算法会用到 “大”, “小” 的概念
        使用STL时,在缺省的情况下,以下三个说法等价:
        1)x比y小
        2)表达式“x < y”为真
        3)y 比 x大

8 STL中“相等”概念

    -- 有时, “x和y相等”等价于“x==y为真”
        例如:在未排序的区间上进行的算法,如顺序查找find
    -- 有时, “x和y相等”等价于“x小于y和y小于x同时为假”
        例如:
            有序区间算法,如binary_search
            关联容器自身的成员函数find
            ......
    例子(此工程iterator4.cpp)
/**
 *      STL中 “相等” 概念演示
 *
 */

#include <iostream>
#include <algorithm>

using namespace std;

class A
{
    int v;
public:
    A(int n):v(n){}
    bool operator< (const A& a2) const
    {
        cout << v << "<" << a2.v << "?" << endl;
        return false;   // 意味着任何两个class A的对象一个都不会小于另外一个
    }
    bool operator== (const A& a2) const
    {
        cout << v << "==" << a2.v << "?" << endl;
        return v == a2.v;
    }
};

int main()
{
    A  a[] = {A(1), A(2), A(3), A(4), A(5)};
    /**
     *      问题:a[]中没有跟A(9)相同的元素,返回值应该是0  但实际输出结果是
     *          3 < 9?
     *          2 < 9?
     *          1 < 9?
     *          9 < 1?
     *          1
     *      原因:根据输出说明binary_search在执行的过程中,判断有没有哪个数组元素与A(9)相等,用的不是==  而是<
     *          由于查找过程中 1<9?不成立  9<1?不成立  因此认为1和9相等,返回1
     */
    cout << binary_search(a, a+4, A(9));    //折半查找
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值