• C++泛型和算法


    看书的速度终于慢了下来,倒不是难于理解,而是需要理解的东西有点多。

    吐槽下C++Primer这本书,不少地方都是用抽象的语言进行介绍!

    拜托,你这是介绍,不是总结!

    像容器适配器那里:

    “本质上,适配器是使一事物的行为类似于另一事物的行为的一种机制。容器适配器让一种已存在的容器类型采用另一种 不同的抽象类型的工作方式实现。”

    直接说转换接口不是更通俗易懂吗???

    >>>>>>>>>>>>>>>>>吐槽结束>>>>>>>>>>>>>>>>>>>>>

    泛型,generic,这个概念比较抽象。当初学Java的时候对这个词就不知所云,不过看过例子就明白了。--纠结于汉语的博大精深~

    C++中的泛型也是类似的概念,虽然还没看到后面的部分。

    算法,书中特指的是标准库自带的算法,据说100多种,大多用于操作容器(将IO流也看作某种序列)。

    基本上,算法应用于一段范围内的元素上,而算法又独立于容器,所以算法大多是通过一对迭代器来遍历并操作元素。

    所以要求迭代器能自增自减、能解引用、能比较、能标识结尾,有的还要求容器的元素类型支持比较等---这与具体的算法有关,就不一一细说了。

    注意,多数时候不要求类型匹配,只要元素可以比较即可。

    迭代器:容器对象迭代器、io流对象迭代器!--因为io流可以看做一种序列,其迭代器可以自增。

    容器对象迭代器的格式如下:

    C<T>::iterator iter=c.begin(); // or .end()
    C<T>::const_iterator iter=c.begin(); // or .end()
    C<T>::reverse_iterator iter=c.rbegin(); // or .rend() 

    io流对象迭代器的格式如下:

    istream_iterator<T> in(istream&); //绑定输入流,如cin等。
    istream_iterator<T> eof; //超出末端迭代器!!!用于判断是否结束。
    ostream_iterator<T> out(ostream&); //绑定输出流,如cout等。

    上面,需要说明的是,如果输入流遇到错误或结束符,则迭代器指向eof

    另外,io对象流中的数据需要迭代器不断自增以读取或输出。

    关于容器逆向迭代器,就是从尾部rbegin()开始,至头部前面rend()。可以通过vi.base()获取对应的正向迭代器--但是注意了,二者并非指向同一个元素!!!

    书中罗列的函数

    find(b, e, val); //范围内查找元素,如找到,返回该元素的迭代器,否则返回超出末端迭代器。
    
    find_if(b, e, func); //范围内查找满足函数func的元素,返回第一个满足元素的迭代器或超出末端迭代器。
    
    
    accumulate(b, e, init_val); //累加范围内的元素,再加上init_val。init_val的意义在于指明类型。务必注意字符串字面值和string的区别,这里不会自动转换!
    
    
    find_first_of(b1, e1, b2, e2); //从第一个范围内查找第二范围内出现的任意的元素。可用于统计公有元素数量或元素(见例子)
    
    
    fill(b, e, val); //范围内的元素用val覆盖。
    
    fill_n(iter, count, val); //从iter开始,用val覆盖count长度范围内的元素。--要求iter+count在有效范围内!!!
    
    
    //迭代器适配器
    
    back_inserter(c); //写入的时候,底层调用push_back
    
    front_inserter(c); //写入的时候,底层调用push_front。所以vector不行。
    
    inserter(c); //写入的时候,底层调用insert。
    
    //迭代器适配器返回包装后的迭代器,方法一样,但操作不同。如:
    
    fill_n(back_inserter(c), count, val); //这样会在尾部追加count个val。
    
    
    copy(b, e, iter); //将范围内的元素复制到iter后面。
    
    
    //算法的_copy版本!对输入元素进行处理,但不修改原元素,而是创建一个副本。
    
    replace(b, e, v1, v2); //用v2替换范围内的v1。
    
    replace_copy(b, e, iter, v1, v2); //用v1替换范围内的v2,并保存到iter处。be范围内不变。--需要指定目标迭代器
    
    
    sort(b, e); //对范围内的元素进行排序
    
    stable_sort(b, e, func); //其实就是懒排序,例如通过长度排序时,只要相邻的元素长度一致,则相对位置不会改变。
    
    unique(b, e); //将范围内的元素去重后 覆盖范围内前面的元素,返回没被覆盖的第一个元素迭代器。
    
    
    count(b, e, val); //
    
    count_if(b, e, func); //
  • 相关阅读:
    vue3.0 sync属性变化
    webRTC技术
    Vue3不支持eventBus
    远程连接MySQL数据库报错:is not allowed to connect to this MYSQL server的解决办法
    基于node.js实现前端web项目自动化部署
    SH 远程连接 Windows 服务器
    七牛云使用之配置域名CNAME
    基于python win32setpixel api 实现计算机图形学相关操作
    [JavaScript闭包]Javascript闭包的判别,作用和示例
    将exe程序添加到服务的命令
  • 原文地址:https://www.cnblogs.com/larryzeal/p/5606452.html
Copyright © 2020-2023  润新知