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

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

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

  

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

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

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

只读算法

  类似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可以采用引用方式捕获变量。

  隐式捕获

    在捕获列表中写 & 或 =

   

时间: 2024-10-14 00:14:03

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

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

动态内存与智能指针 在C++中, 动态内存用 new来分配空间并返回一个指向该对象的指针 用delete来销毁. 由于手动的对动态内存进行操作容易出现问题.所以新的标准库提供了两种智能指针. 智能指针的行为类似于常规指针.区别在于他负责自动释放所指对象. shared_ptr : 允许多个指针指向同一个对象. unique_ptr :独占所指向的对象 weak_ptr   :是一种弱引用,指向shared_ptr 所管理的对象 shared_ptr 类 类似vector ,shared_ptr

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

这一章介绍顺序容器,在之前的第三章中,了解到的vector就属于顺序容器的一种. 一个容器就是一些特定类型对象的集合. 除了vector,还有哪些顺序容器? vector: 大小可变,随机访问的速度很快,但是在尾部之外的部分插入或删除元素可能会很慢. deque : 随机访问的速度很快,在头和尾插入或删除的速度都很快. list: 双向链表,只支持双向顺序访问,在任何位置插入或删除操作都很快(链表的特性) forward_list: 单向链表,只支持单向的随机访问.在任何位置插入或删除都很快 a

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

到了第二章,其实才算是真正的开始.也就是本书的第一部分C++基础. 第一章可以说就是第一部分的一个简单的梗概. 从第二章开始,对C++的学习步入正轨,从最基础的开始学起,也就是 变量. 而说到变量就不得不说类型. 第二章讨论的主要就是如下几点: 1.什么是基本类型,什么是复合类型? 2.什么是变量,什么是常量? 3.什么是类型别名 4.定义数据结构(struct) 我认为本章讨论常量的部分,对后面的学习影响很大,如果没有理解清楚const的复合类型的一些细节问题,会对后面函数和类的部分的学习造成

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

第三章,主要内容是字符串和数组.感觉作者的意图是希望读者可以早一点可以写出简单的小程序,并且可以早点接触迭代器这种思想. 在我看来,这种内容的难度并不大. 对于编程来说,最重要的应该是思想,类似vector的各种操作,读者仅仅只需要知道vector可以做这些操作,真正用到的时候,能够想起来,再去查就好了. 在看<UNIX环境高级编程>的时候,各种系统调用,不可能每一个都记得熟,所以我认为这种只需要知道“可以这么做“就行了,用到的时候再查,久而久之自然就熟悉了. 然而关键的是为什么,比如为什么要

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

<C++ Primer>这本书可以说是公认的学习C++最好的书,但我觉得不是特别适合作为教材,书中内容的顺序让人有些蛋疼.我个人认为初学此书是不能跳着看的.如果急于上手的话,我更推荐<C++程序设计>. 首先是第一章,第一章可以说是本书第一部分的一个简略的概括.对于有其他编程语言经验的读者来说,看完这章基本可以看出C++的基本语法与其他语言的差异.对于零基础的读者,可以跟着书中内容写一些小程序了. 本主要介绍了以下几点: 1.一个最简单的C++程序是什么样的. 2.初步了解输入流和

学习C++ Primer 的个人理解(六)

第四章和第五章没什么特别的.基本上就是书本上的字面意思,也没什么需要注意的细节.直接记录第六章. 本章介绍了函数,其实也没什么特别的.但有几个重点 1.形参的类型决定了形参和实参的交互方式.形参是引用,则它将绑定到实参上. 2.实参的值拷贝给形参时,形参和实参是两个相互独立的对象. 当初始化一个非引用类型变量时,初始值被拷贝给变量.此时对变量的改动不会影响初始值. 3.对于指针形参,函数接收一个指针,实际上跟非引用类似,拷贝的是指针的值,两个指针是不同的指针 C++中,建议用引用类型的形参代替指

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

类,后面还有两章是介绍有关于类的内容的.这一张依然只是个概括.但也已经将大致用法介绍完了. 重点如下: 1.成员函数的声明,必须在类的内部. 2.引用const成员函数 我们知道成员函数中有一个名为this的隐式参数,相当于调用它的那个对象. 默认情况下,this是顶层const的.也就意味着,我们不能把this绑定到一个常量对象上. 还记得第二章关于const的细节问题么? this是顶层const的,意味着this本身不能被改变. 而如果对象是一个常量对象,那我就不能把this绑定到对象上.

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

关联容器 就像是个字典, 其元素是 键 - 值 对. 关键字起到索引作用. 有序: map:关联数组:保存 健-值 对 set : 关键字既是值. multimap : 关键字可重复出现的map multiset   : 关键字可重复出现的set 无序: unordered_ 前四个 使用map map<sring ,size_t> word_count; 使用set set<string> exclude pair类型 一个pair类型保存两个数据成员. 创建一个pair时,我们

学习游戏要学习编程语言吗?十大主流编程语言解析

计算机的发展,促使了一个新的职业的出现,程序员是近些年出现的并且得到了广泛关注的一个职业,相信这也是很多莘莘学子的职业梦想.但程序员也有很多种,并不是每一个程序员能够精通所有的编程语言.所谓术业有专攻,如果将来志在编程世界的网友就要注意了,今天给大家推荐一下2014年最流行的编程语言,他们可以说是未来程序员们生存的工具. 1.JavaScript JavaScript在Web应用上有着非常大的需求,JavaScript主要用于实现为Web浏览器,以提供增强的用户界面和动态网站. 直到google