标准库没有给每个容器都定义成员函数来实现 查找,替换等操作。而是定义了一组泛型算法,他们可以用于不同类型的元素或多种容器类型。

迭代器令算法不依赖与容器

  

算法永远不会执行容器的操作

  算法本身不会执行容器的操作,他只会运行于迭代器之上。

  算法永远不会改变底层容器的大小,有可能改变元素的值,也可能在容器内移动元素,但永远不会直接添加或删除元素。

只读算法

  类似find就是这样一种算法,只会读取其输入范围内的元素,永远不会改变元素。

  

  accumulate也是只读算法。

  int sum = accumulate ( vec.cbegin(), vec.cen() , 0 );//对vec中的元素求和。

  算法和元素类型

    string sum = accumulate(vec.cbegin(), vec.cen() , string("")); // 这样是可行的,因为string类型定义了+运算

    string sum = accumulate(vec.cbegin(), vec.cen() ,"");     //这样是不行的,因为这样的字面值实际上const char* 没有定义+运算符

  操作两个序列的算法

    equal() , 用于确定两个序列是保存相同的值。

    equal( roster1.cbegin() , roster1.cend(),roster2.cbegin())

    所有接受单一迭代器表示第二序列的算法,都假定第二序列至少和第一序列一样长。

  

  写容器元素的算法

    fill ( vec.begin() , vec.end() , 0) // 将每个元素重置为0

  算法不检查写操作

    算法假定写入指定个元素是安全的。

    向目的位置迭代器写入数据的算法假定目的位置足够大,能够容纳要写入的元素

  back_inserter

    这种算法保证有足够的空间来容纳输出的数据。 插入迭代器

    back_inserter接受一个指向容器的引用,返回一个与该容器绑定的插入迭代器。当我们通过此迭代器赋值时,赋值运算符会调用push_back将一个具有给定值的元素添加到容器中。

    vector<int> vec;

    auto it  = back_inserter(vec);

    *it = 42;

  

lambda表达式

  根据算法接受一元谓词还是二元谓词,我们传递给算法的谓词必须严格接受一个或两个参数。有时候我们希望操作更多的参数。则可以使用lambda表达式。

    

  一个lambda表示一个可调用的代码单元。格式如下:

  [捕获列表] (参数列表) -> 返回类型 { 函数体 }

  可以忽略参数列表和返回类型,如:

    auto f = [] {return 42; }

向lambda传递参数

  使用捕获列表,lambda需要明确指明需要哪些变量。将其放在捕获列表中。

  lambda可以采用引用方式捕获变量。

  隐式捕获

    在捕获列表中写 & 或 =

   

学习C++ Primer 的个人理解(十)的更多相关文章

  1. 学习C++ Primer 的个人理解(十二)

    动态内存与智能指针 在C++中, 动态内存用 new来分配空间并返回一个指向该对象的指针 用delete来销毁. 由于手动的对动态内存进行操作容易出现问题.所以新的标准库提供了两种智能指针. 智能指针 ...

  2. 学习C++ Primer 的个人理解(一)

    <C++ Primer>这本书可以说是公认的学习C++最好的书,但我觉得不是特别适合作为教材,书中内容的顺序让人有些蛋疼.我个人认为初学此书是不能跳着看的.如果急于上手的话,我更推荐< ...

  3. 学习C++ Primer 的个人理解(九)

    这一章介绍顺序容器,在之前的第三章中,了解到的vector就属于顺序容器的一种. 一个容器就是一些特定类型对象的集合. 除了vector,还有哪些顺序容器? vector: 大小可变,随机访问的速度很 ...

  4. 学习C++ Primer 的个人理解(三)

    第三章,主要内容是字符串和数组.感觉作者的意图是希望读者可以早一点可以写出简单的小程序,并且可以早点接触迭代器这种思想. 在我看来,这种内容的难度并不大. 对于编程来说,最重要的应该是思想,类似vec ...

  5. 学习C++ Primer 的个人理解(二)

    本身就一定基础的读者我想变量常量这些概念应该已经不是问题了.但是本章还是有几个重点,需要特别留意一下的: 1.初始化和赋值是不同的操作 2.任何非0值都是true 3.使用新标准列表初始化,在有丢失精 ...

  6. 学习C++ Primer 的个人理解(零)

    由于自己看书之后经常容易忘记细节,所以写在博客上让我自己的思路更加清晰一些. 我的博客仅仅只是将书中的内容概括一下,有一些不好理解的部分我会用我自己理解的方式使用大白话写出来. 仅此而已.

  7. 学习C++ Primer 的个人理解(十一)

    关联容器 就像是个字典, 其元素是 键 - 值 对. 关键字起到索引作用. 有序: map:关联数组:保存 健-值 对 set : 关键字既是值. multimap : 关键字可重复出现的map mu ...

  8. 学习C++ Primer 的个人理解(八)

    结束了第一部分,在最后的第七章,我只简单的总结了一下,因为后面还会更详细的说明有关类的内容.而且说实在的这一张的内容让我很不舒服,验证了本书实际上有许多内容是作者的学生一起拼凑而成的.第七章结构给我感 ...

  9. 学习C++ Primer 的个人理解(七)

    类,后面还有两章是介绍有关于类的内容的.这一张依然只是个概括.但也已经将大致用法介绍完了. 重点如下: 1.成员函数的声明,必须在类的内部. 2.引用const成员函数 我们知道成员函数中有一个名为t ...

随机推荐

  1. Uploadify 3.2 参数属性、事件、方法函数详解

    一.属性 属性名称 默认值 说明 auto true 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 . buttonClass ” 按钮样式 buttonCursor ‘ ...

  2. SCOM2012端口需求

    Agent push requirements (including firewall ports): The account being used to push the agent must ha ...

  3. 常见排序算法及其java实现

    最近学习了下java,感觉java在基本语法上与C++非常相似.作为练习,我用java实现了冒泡排序.选择排序.插入排序.基尔排序.快速排序.堆排序.计数排序.合并排序. 以下为实现代码: publi ...

  4. 用Bootstrap 写了个站点

    近期发现vdceye的站点有些丑陋,就找了一个bootstrap工具,又一次把站点写了一遍 这个工具果然好用 http://vdceye.com/

  5. URL和DNS解析

    以下内容摘自<Go Web编程>,介绍的通俗易懂. 我们浏览网页都是通过URL访问的,那么URL到底是怎么样的呢? URL(Uniform Resource Locator)是“统一资源定 ...

  6. NodeJs + gm图片缩略图

    我的另一篇文章: Nginx/Apache图片缩略图技术 gm官网 1, 软件环境 nodejs npm GraphicsMagick or ImageMagick 貌似ImageMagick在处理大 ...

  7. PAT 1007

    1007. Maximum Subsequence Sum (25) Given a sequence of K integers { N1, N2, ..., NK }. A continuous ...

  8. php 关于session_start()总是提示错误

    1.session_start();执行前不能有输出,或者漆面有ob_start();并php.ini配置output_buffering = On; 2.如果是utf8文件的话,要注意前面是否有bo ...

  9. linux服务器上apache+php独立于mysql server单独部署

    1. mysql client 2. libmysqlclient-devel 3. PDO_MYSQL

  10. ssh用root直接登录失败的问题

    解决方法: 1) 以root身份,chmod +w /etc/ssh/sshd_config 2) vi /etc/ssh/sshd_config 3) 将PermitRootLogin no改成Pe ...