摘要: 友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字 friend 开始。它只能出现在类定义的内部。友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受声明出现部分的访问控制影响。通常,将友元声明成组地放在类定义的开始或结尾是个好主意。友元关系:一个例子想像一下,除了 Screen 类之外,还有一个窗口管理器,管理给定显示器上的一组 Screen。窗口管理类在逻辑上可能需要访问由其管理的 Screen 对象的内部数据。假定 Window_Mgr 是该窗口管理类的名字,Screen 应该允许 Window_Mgr 像下面这样访问其成员:c 阅读全文
posted @ 2013-07-17 13:54 HandsomeDragon 阅读(373) 评论(0) 推荐(1) 编辑
摘要: C++ 标准化过程做出的更重要的贡献之一是:创建和扩展了标准库。容器和算法库是标准库的基础。标准库定义了超过一百个算法。幸运的是,这些算法具有相同的结构,使它们更易于学习和使用。算法与类型无关:它们通常在一个元素序列上操作,这些元素可以存储在标准库容器类型、内置数组甚至是生成的序列(例如读写流所生成的序列)上。算法基于迭代器操作,从而实现类型无关性。大多数算法使用一对指定元素范围的迭代器作为其头两个实参。其他的迭代器实参包括指定输出目标的输出迭代器,或者用于指定第二个输入序列的另一个或一对迭代器。迭代器可通过其所支持的操作来分类。标准库定义了五种迭代器类别:输入、输出、前向、双向和随机访问迭代 阅读全文
posted @ 2013-07-12 10:35 HandsomeDragon 阅读(191) 评论(0) 推荐(0) 编辑
摘要: list 容器上的迭代器是双向的,而不是随机访问类型。由于 list 容器不支持随机访问,因此,在此容器上不能使用需要随机访问迭代器的算法。这些算法包括 sort 及其相关的算法。还有一些其他的泛型算法,如 merge、remove、reverse 和 unique,虽然可以用在 list 上,但却付出了性能上的代价。如果这些算法利用 list 容器实现的特点,则可以更高效地执行。如果可以结合利用 list 容器的内部结构,则可能编写出更快的算法。与其他顺序容器所支持的操作相比,标准库为 list 容器定义了更精细的操作集合,使它不必只依赖于泛型操作。表 11.4 列出了 list 容器特有的 阅读全文
posted @ 2013-07-11 17:35 HandsomeDragon 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 【3. 反向迭代器】反向迭代器是一种反向遍历容器的迭代器。其将自增(和自减)的含义反过来了:对于反向迭代器,++ 运算将访问前一个元素,而 -- 运算则访问下一个元素。所有容器还定义了 rbegin 和 rend 成员,分别返回指向容器尾元素和首元素前一位置的反向迭代器。与普通迭代器一样,反向迭代器也有常量(const)和非常量(nonconst)类型。图 11.1 使用一个假设名为 vec 的 vector 类型对象阐明了这四种迭代器之间的关系。假设有一个 vector 容器对象,存储 0-9 这 10 个以升序排列的数字:vector vec;for (vector::size_type 阅读全文
posted @ 2013-07-08 17:03 HandsomeDragon 阅读(542) 评论(0) 推荐(0) 编辑
摘要: 【0. 概述总览】之前已强调标准库所定义的迭代器不依赖于特定的容器。事实上,C++ 语言还提供了另外 3 种迭代器:插入迭代器: 与容器绑定在一起,实现在容器中插入元素的功能。 iostream 迭代器: 可与输入或输出流绑定在一起,用于迭代遍历所关联的 IO 流。反向迭代器: 实现向后遍历,而不是向前遍历。所有容器类型都定义了自己的 reverse_iterator 类型, 由 rbegin 和 rend 成员函数返回。上述迭代器类型都在 iterator 头文件中定义。【1. 插入迭代器】通过插入迭代器赋值时,迭代器将会插入一个新的元素。C++ 语言提供了 ... 阅读全文
posted @ 2013-07-08 16:31 HandsomeDragon 阅读(427) 评论(0) 推荐(0) 编辑
摘要: [0. 需求]最近在粗略学习《C++ Primer 4th》的容器内容,关联容器的章节末尾有个很不错的实例。通过实现一个简单的文本查询程序,希望能够对C++的容器学习有更深的理解。由于是浅略探讨研究,高手可无视,各位读者发现有什么不妥的地方,请指教。程序将读取用户指定的任意文本文件,然后允许用户从该文件中查找单词。查询的结果是该单词出现的次数,并列出每次出现所在的行。如果某单词在同一行中多次出现,程序将只显示该行一次。行号按升序显示,即第 1行应该在第 2 行之前输出,依此类推。本人用到的文本文件“ inputfile.txt ”,内容如下(显示的行号并非文件原内容):1 Our progra 阅读全文
posted @ 2013-06-24 16:49 HandsomeDragon 阅读(3024) 评论(3) 推荐(0) 编辑
摘要: map 和 set 容器中,一个键只能对应一个实例。而 multiset 和 multimap 类型则允许一个键对应多个实例。例如,在电话簿中,每个人可能有单独的电话号码列表;在作者的文章集中,每位作者可能有单独的文章标题列表。multimap/ultiset 类型的定义也在 map 和 set 头文件。multimap/multiset 所支持的操作与 map/set 只有一个不同:multimap 不支持下标运算。因为在这类容器中,某个键可能对应多个值。因此,multiset/multimap 对应 set/map 中相同的操作都以不同的方式做出了一定的修改。[1. 元素的添加和删除]in 阅读全文
posted @ 2013-06-21 10:16 HandsomeDragon 阅读(596) 评论(0) 推荐(0) 编辑
摘要: set类型map 容器是键-值对的集合,好比以人名为键的地址和电话号码。相反地,set 容器只是单纯的键的集合。map 适用于字典、电话本、商品价目表等类似的模型。set 适用于黑名单、白名单等。// set 容器支持大部分的 map 操作,包括下面几种:1. 顺序容器和关联容器公共的操作通用的容器操作。2. 构造函数。(map<k, v> m; map<k, v> m(m2); map<k, v> m(b, e); )3. nsert 操作。(m.insert(e); m.insert(beg, end); m.insert(iter, e); )4. c 阅读全文
posted @ 2013-06-19 16:03 HandsomeDragon 阅读(540) 评论(0) 推荐(0) 编辑
摘要: map 是键-值对的集合。map 类型通常可理解为关联数组(associative array):可使用键作为下标来获取一个值,正如内置数组类型一样。而关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置来获取。[1. map 对象的定义]要使用 map 对象,则必须包含 map 头文件。在定义 map 对象时,必须分别指明键和值的类型:// count number of times each word occurs in the inputmap<string, int> word_count; // empty map from string to int 阅读全文
posted @ 2013-06-18 10:56 HandsomeDragon 阅读(860) 评论(0) 推荐(0) 编辑
摘要: [0. 概述]关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。虽然关联容器的大部分行为与顺序容器相同,但其独特之处在于支持键的使用。关联容器(Associative containers)支持通过键来高效地查找和读取元素。两个基本的关联容器类型是 map 和 set。map 的元素以键-值(key-value)对的形式组织:key 用作元素在 map 中的索引,而 value 则表示所存储和读取的数据。set 仅包含一个键,并有效地支持关于某个键是否存在的查询。一般来说,如果希望有效地存储不同值的集合,那么使用 s 阅读全文
posted @ 2013-06-17 16:46 HandsomeDragon 阅读(404) 评论(0) 推荐(0) 编辑