文章分类 -  C++基础

摘要:概述 大多数算法都定义在头文件 中,标准库还在头文件 中定义了一组数值泛型算法。 一般情况下,这些算法并不直接操作容器,而是遍历由两个迭代器指定的一个元素范围来进行操作。通常情况下,算法遍历范围,对其中每个元素都进行一些处理。 从 vector 中查找值: sum的初始化值为空串,通过第三个参数显示 阅读全文 »
posted @ 2020-03-15 13:05 刘-皇叔 阅读(139) 评论(0) 推荐(0) 编辑
摘要:处理指针成员的另一个完全不同的方法,是给指针成员提供值语义。具有值语义的类所定义的对象,其行为很像算术类型的对象:复制值型对象时,会得到一个不同的新副本。对副本所做的改变不会反映在原有对象上, 反之亦然。string类是值型类的一个例子。 要使指针成员表现得像一个值,复制 HasPtr 对象时必须复 阅读全文 »
posted @ 2018-05-15 20:50 刘-皇叔 编辑
摘要:包含指针的类需要特别注意复制控制,原因是复制指针时只复制指针中的地址,而不会复制指针指向的对象。设计具有指针成员的类时,类设计者必须首先需要决定的是该指针应提供什么行为。将一个指针复制到另一个指针时,两个指针指向同一对象。当两个指针指向同一对象时,可能使用任一指针改变基础对象。类似地,很可能一个指针 阅读全文 »
posted @ 2018-05-15 20:44 刘-皇叔 编辑
摘要:构造函数的一个用途是自动获取资源。例如,构造函数可以分配一个缓冲区或打开一个文件,在构造函数中分配了资源之后,需要一个对应操作自动回收或释放资源。析构函数就是这样的一个特殊函数,它可以完成所需的资源回收,作为类构造函数的补充。 何时调用析构函数 撤销类对象时会自动调用析构函数: 变量(如 item) 阅读全文 »
posted @ 2018-05-15 20:28 刘-皇叔 编辑
摘要:与类要控制初始化对象的方式一样,类也定义了该类型对象赋值时会发生什么: 与复制构造函数一样, 如果类没有定义自己的赋值操作符, 则编译器会合成一个。 介绍重载赋值 重载操作符是一些函数,其名字为 operator 后跟着所定义的操作符的符号。因此,通过定义名为 operator= 的函数,我们可以对 阅读全文 »
posted @ 2018-05-15 20:21 刘-皇叔 编辑
摘要:合成的复制构造函数 如果我们没有定义复制构造函数,编译器就会为我们合成一个。与合成的默认构造函数不同,即使我们定义了其他构造函数,也会合成复制构造函数。合成复制构造函数的行为是,执行逐个成员初始化,将新对象初始化为原对象的副本。所谓“逐个成员”,指的是编译器将现在对象的每个非 static 成员,依 阅读全文 »
posted @ 2018-05-15 20:18 刘-皇叔 编辑
摘要:只有单个形参,而且该形参是对本类类型对象的引用(常用 const 修饰),这样的构造函数称为复制构造函数。与默认构造函数一样,复制构造函数可由编译器隐式调用。复制构造函数可用于: 根据另一个同类型的对象显式或隐式初始化一个对象。 复制一个对象,将它作为实参传给一个函数。 从函数返回时复制一个对象。 阅读全文 »
posted @ 2018-05-15 20:15 刘-皇叔 编辑
摘要:铭记于心:学习一门语言最重要的方法就是不断的练习、练习、练习。 C++中的注释 单行注释符 界注释符 界注释符不能发生嵌套,一旦嵌套,在编译时会发生莫名其妙的错误,如下例子为错误: 为了体现界注释符的范围通常在界注释符每行开头加一个* 从键盘输入文件结束符 当从键盘向程序输入数据时,对于如何指出文件 阅读全文 »
posted @ 2018-05-14 10:31 刘-皇叔 编辑
摘要:容器特有的算法 list 容器上的迭代器是双向的,而不是随机访问类型。由于 list 容器不支持随机访问,因此,在此容器上不能使用需要随机访问迭代器的算法。这些算法包括 sort 及其相关的算法。还有一些其他的泛型算法,如 merge、remove、reverse 和 unique,虽然可以用在 l 阅读全文 »
posted @ 2018-05-10 22:57 刘-皇叔 编辑
摘要:算法的形参模式 任何其他的算法分类都含有一组形参规范。理解这些形参规范有利于学习新的算法——只要知道形参的含义,就可专注于了解算法实现的操作。大多数算法采用下面四种形式之一: 其中,alg 是算法的名字,beg 和 end 指定算法操作的元素范围。我们通常将该范围称为算法的“输入范围”。尽管几乎所有 阅读全文 »
posted @ 2018-05-10 22:56 刘-皇叔 编辑
摘要:算法要求的迭代器操作分为五个类别: Input iterator(输入迭代器) 读,不能写;只支持自增运算 Output iterator(输出迭代器) 写,不能读;只支持自增运算 Forward iterator(前向迭代器) 读和写;只支持自增运算 Bidirectional iterator( 阅读全文 »
posted @ 2018-05-10 22:54 刘-皇叔 编辑
摘要:反向迭代器 反向迭代器是一种反向遍历容器的迭代器。也就是,从最后一个元素到第一个元素遍历容器。反向迭代器将自增(和自减)的含义反过来了:对于反向迭代器,++ 运算将访问前一个元素,而 -- 运算则访问下一个元素。 回想一下,所有容器都定义了 begin 和 end 成员,分别返回指向容器首元素和尾元 阅读全文 »
posted @ 2018-05-10 22:51 刘-皇叔 编辑
摘要:虽然 iostream 类型不是容器,但标准库同样提供了在 iostream 对象上使用的迭代器: istream_iterator 用于读取输入流,而 ostream_iterator 则用于写输出流。这些迭代器将它们所对应的流视为特定类型的元素序列。使用流迭代器时,可以用泛型算法从流对象中读数据 阅读全文 »
posted @ 2018-05-10 22:49 刘-皇叔 编辑
摘要:C++ 语言提供了另外三种迭代器: 插入迭代器:这类迭代器与容器绑定在一起,实现在容器中插入元素的功能。 iostream 迭代器:这类迭代器可与输入或输出流绑定在一起,用于迭代遍历所关联的 IO 流。 反向迭代器:这类迭代器实现向后遍历,而不是向前遍历。所有容器类型都定义了自己的 reverse_ 阅读全文 »
posted @ 2018-05-10 22:45 刘-皇叔 编辑
摘要:实例: 在一个文本中实现: 1. 去掉所有重复的单词。 2. 按单词的长度排序。 3. 统计长度等于或超过 6 个字符的单词个数。 对于输入: 程序应该产生如下输出: 去除重复 假设我们的输入存储在一个名为 words 的 vector 对象中,第一个子问题是将 words 中重复出现的单词去除掉: 阅读全文 »
posted @ 2018-05-10 22:43 刘-皇叔 编辑
摘要:一些算法写入元素值。在使用这些算法写元素时要当心,必须确保算法所写的序列至少足以存储要写入的元素。有些算法直接将数据写入到输入序列,另外一些则带有一个额外的迭代器参数指定写入目标。这类算法将目标迭代器用作输出的位置。还有第三种算法将指定数目的元素写入某个序列。 写入输入序列的元素 写入到输入序列的算 阅读全文 »
posted @ 2018-05-10 22:36 刘-皇叔 编辑
摘要:accumulate 假设 vec 是一个 int 型的 vector 对象,下面的代码: 将 sum 设置为 vec 的元素之和再加上 42。accumulate 带有三个形参。头两个形参指定要累加的元素范围。第三个形参则是累加的初值。accumulate 函数将它的一个内部变量设置为指定的初值, 阅读全文 »
posted @ 2018-05-10 22:33 刘-皇叔 编辑
摘要:泛型算法 标准库容器定义的操作非常少。标准库没有给容器添加大量的功能函数,而是选择提供一组算法,这些算法大都不依赖特定的容器类型,是“泛型”的,可作用在不同类型的容器和不同类型的元素上。 大多数算法是通过遍历由两个迭代器标记的一段元素来实现其功能。典型情况下,算法在遍历一段元素范围时,操纵其中的每一 阅读全文 »
posted @ 2018-05-10 22:30 刘-皇叔 编辑
摘要:我们的程序将读取用户指定的任意文本文件,然后允许用户从该文件中查找单词。查询的结果是该单词出现的次数,并列出每次出现所在的行。如果某单词在同一行中多次出现,程序将只显示该行一次。行号按升序显示。 查询程序的设计 设计程序的一个良好习惯是首先将程序所涉及的操作列出来。明确需要提供的操作有助于建立需要的 阅读全文 »
posted @ 2018-05-07 23:19 刘-皇叔 编辑
摘要:map 和 set 容器中,一个键只能对应一个实例。而 multiset 和 multimap类型则允许一个键对应多个实例。例如,在电话簿中,每个人可能有单独的电话号码列表。在作者的文章集中,每位作者可能有单独的文章标题列表。multimap和 multiset 类型与相应的单元素版本具有相同的头文 阅读全文 »
posted @ 2018-05-07 23:14 刘-皇叔 编辑

点击右上角即可分享
微信分享提示