泛型算法中,所谓“泛型(generic)”指的是两个方面:这些算法可作用于各种不同的容器类型,而这些容器又可以容纳多种不同类型的元素。

第九章 顺序容器

顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。

IO库类型不支持复制或赋值。因此,不能创建存放IO类型对象的容器。

定义容器的容器时,注意使用空格:

vector< vector<string> > lines;    OK

vector<vector<string>> lines;     ERROR

两个迭代器相加的操作是未定义的。

vector和deque容器提供了对元素的快速随机访问,但付出的代价是,在容器的任意位置插入或删除元素,比在容器尾部插入和删除的开销更大。list类型的任何位置都能快速插入和删除,但付出的代价是元素的随机访问开销较大。

在list容器的元素之间移动的唯一方法是顺序跟随指针。

string类型与vector容器不同的是,它不支持以栈方式操纵容器:在string类型中不能使用front、back和pop_back操作。

第十章 关联容器

关联容器与顺序容器的区别:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。

关联容器支持通过键来高效地查找和读取元素。两个基本的关联容器类型是map和set。map的元素以键-值(key-value)对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。

一般来说,如果希望有效地存储不同值的集合,那么使用set容器比较合适,而map容器则更适用于需要存储(乃至修改)每个键所关联的值的情况。

关联容器不能通过容器大小来定义,因为这样的话就无法知道键所对应的值是什么。

对于键类型,唯一的约束就是必须支持 < 操作。

map<K,V>::value_type 一个pair类型,它的first元素具有constmap<K,V>::key_type类型,而second元素则为map<K,V>::mapped_type类型。

在学习map的接口时,需谨记value_type是pair类型,它的值成员可以修改,但键成员不能修改。

map迭代器进行解引用将产生pair类型的对象。

使用下标访问map与使用下标访问数组或vector的行为截然不同:用下标访问不存在的元素将导致在map容器中添加一个新的元素,它的键即为该下标值。

--------------------经典的小代码--------------------

// count number of times each word occurs in the input

map<string,int> word_count; //empty map from string to int

string word;

while (cin>>word)

++word_count[word];

--------------------经典的小代码--------------------

在添加新的map元素时,使用insert成员可避免使用下标操作符所带来的副作用:不必要的初始化。

map对象中一个给定键只对应一个元素。如果试图插入的元素所对应的键已在容器中,则insert将不做任何操作。

查找并读取map中的元素:如果希望当具有指定键的元素存在时,就获取该元素的引用,否则就不在容器中创建新的元素,那么应该使用find。

set容器只是单纯的键的集合。set不支持下标操作符,而且没有定义mapped_type类型。与map一样,set容器存储的键也必须唯一,而且不能修改。

在获得指向set中某元素的迭代器后,只能对其做读操作,而不能做写操作。

在multimap中,同一个键所关联的元素必然相邻存放。

第十一章 泛型算法

关键概念:泛型算法永不执行容器提供的操作

理解算法的最基本方法是了解该算法是否读元素、写元素或者对元素进行重新排序。

初学者常犯的错误:在没有元素的空容器上调用fill_n函数(或者类似的写元素算法)。

流迭代器的限制:

1、不可能从ostream_iterator对象读入,也不可能写到istream_iterator对象中。

2、一旦给ostream_iterator对象赋了一个值,写入就提交了。赋值后,没有办法在改变这个值。此外,ostream_iterator对象中每个不同的值都只能正好输出一次。

3、ostream_iterator没有->操作符。

标准库定义了五种迭代器类型:输入、输出、前向、双向和随机访问迭代器。

算法从不直接改变它所操纵的序列的大小。(如果算法的实参是插入迭代器,则该迭代器会添加新元素,但算法并不直接这么做。)

待继续····

转载于:https://www.cnblogs.com/fengty90/p/3768871.html

C++Primer第四版 阅读笔记 第二部分 “容器和算法”相关推荐

  1. c++ primer 第五版 阅读笔记四

    第四章 复合类型 4.1 数组 数组的声明:关于数组的内容写了蛮多的,包括一维数组和二维数组的创建.调用.返回等等,甚至用到了static和new/delete关键字,详见:(一维数组相关内容)htt ...

  2. 《Spring实战》第四版读书笔记 第二章 装配Bean

    2019独角兽企业重金招聘Python工程师标准>>> 在Spring中,对象无需自己查找或创建与其所关联的其他对象.相反,容器负责把需要相互协作的对象引用赋予各个对象. 创建应用对 ...

  3. C++ Primer 第三版 读书笔记

    1.如果一个变量是在全局定义的,系统会保证给它提供初始化值0.如果变量是局部定义的,或是通过new表达式动态分配的,则系统不会向它提供初始值0 2.一般定义指针最好写成:" string * ...

  4. Think in Java第四版 读书笔记9第15章 泛型

    Think in Java第四版 读书笔记9第15章 泛型 泛型:适用于很多很多的类型 与其他语言相比 Java的泛型可能有许多局限 但是它还是有很多优点的. 本章介绍java泛型的局限和优势以及ja ...

  5. C++Primer第5版学习笔记(三)

    C++Primer第5版学习笔记(三) 第四/五章的重难点内容 你可以点击这里回顾第三章内容       因为第五章的内容比较少,因此和第四章的笔记内容合并.       第四章是和表达式有关的知识, ...

  6. C++Primer第5版学习笔记(一)

    C++Primer第5版学习笔记(一) 第一.二章的重难点内容        这个笔记本主要记录了我在学习C++Primer(第5版,中文版)的过程中遇到的重难点及其分析.因为第一.二章都比较简单,因 ...

  7. C++ Primer Plus 6th代码阅读笔记

    C++ Primer Plus 6th代码阅读笔记 第一章没什么代码 第二章代码 carrots.cpp : cout 可以拼接输出,cin.get()接受输入 convert.cpp 函数原型放在主 ...

  8. 从《C++ Primer 第四版》入手学习 C++

    从<C++ Primer 第四版>入手学习 C++ 为什么要学习C++? 2009 年本书作者 Stan Lippman 先生来华参加上海祝成科技举办的C++技术大会,他表示人们现在还用C ...

  9. 视觉SLAM十四讲学习笔记-第二讲-开发环境搭建

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 ​​​​​​​ lin ...

最新文章

  1. 判断人工智能是否可信的“四把尺子”
  2. react 引入html文件_javascript – React:如何加载和呈现外部html文件?
  3. 年终总结 | 2021红包点赞?(文末有刺激的福利哦)
  4. dm9000 driver 1
  5. SpringBoot------Servlet3.0的注解自定义原生Listener监听器
  6. Ruby,Python和Java中的Web服务
  7. 最近的工作生活的心得感悟,给自己的表现打50分,不及格
  8. c语言随机产生10个30 100,c语言编写随机产生10个100~200之间整数,幷按从大到小排序...
  9. python做图片-python做图
  10. Linux驱动之分层框架
  11. 解决office 2010每次启动都出现配置进度的方法
  12. 如何编写一份高质量的测试报告
  13. C语言种根号怎么表示 比如(1-x)的二分之一次方
  14. 微型计算机虚拟内存器件,内外存储器与缓存内存虚拟内存.ppt
  15. 工业机器人的TCP点
  16. python课程回顾复习记录简要6
  17. 成龙寿宴筹善款7000万 嘉宾:比春晚还热闹
  18. 计算机网络(6)体系结构:计算机网络协议、接口、服务的概念
  19. 实验室常用培养基配置 LB LA
  20. python中咕噜咕噜的冒泡函数

热门文章

  1. JavaWeb_EL表达式存储数据及获得项目路径
  2. 状态压缩动态规划 - 总结【普及+,提高-】
  3. 关于SET ANSI_PADDING的用法
  4. LeetCode(575)——分糖果(JavaScript)
  5. DPG图片压缩技术和webp图片格式
  6. JavaScript学习(三十二)— Keycode常用键位码对照表
  7. 前端—每天5道面试题(5)
  8. java界面字体大小设置_怎样更改电脑界面的字体大小?
  9. 使用多线程进行网图下载
  10. 什么是互联网保险平台?