• C++再学习之路(三)


    1. 任何insert 或push 操作都可能导致迭代器失效,当编写循环将元素插入到vector 或deque 容器中时,程序必须确保迭代器在每次循环后都得到更新

    2. 容器的比较是基于容器内元素的比较,所有容器都通过比较其元素对来实现关系运算

      容器的比较使用了元素类型定义的同一个关系操作符:两个容器做 != 比较使用了其元素类型定义的 != 操作符

    3. 容器中 begin() 和 end() 返回的迭代器,front() 和 back() 返回的是引用(别名)

    4. swap() 操作

      该操作不会删除或插入任何元素,而且保证在常量的时间内实现交换,因为容器内没有移动任何元素,所以迭代器不会失效

    5. 比起 list 和 deque , vector 的增长效率会更高

    6. capacity 操作获取在容器需要分配更多的存储空间之前能够存储的元素总数,而 reserve 操作告诉 vector 容器应该预留多少元素的存储空间

    7. 通常来说,除非找到使用其他容器的更好理由,否则 vector 容器都是最佳选择

    8. 与 vector 一样,string 的字符也是连续存储的,因此系统还允许使用下标而不是迭代器指定插入位置

    9. 标准库迭代器都支持解引用( * )操作符和箭头( -> )操作符,用于检查迭代器指向的元素值

    10.关联容器和顺序容器的本质差别

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

    11.在应用中,键类型必须定义 < 操作符,而且该操作符能 “正确地工作”

    12.对于 map 类型,其元素类型( value_type )是 pair 类型,它的值成员可以修改,但键成员不可以修改

    13.使用下标访问 map 与使用下标访问数组或 vector 的行为完全不同

      用下标访问不存在的元素将导致在 map 

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

    15.在 multimap 和 multiset 容器中,如果某个键对应多个实例,则这些实例在容器中将相邻存放,迭代遍历multimap 和 multiset 容器时,可保证依次返回特定键所关联的所有的元素

    16.在 multimap中,在同一个键上调用 lower_bound 和 upper_bound,将产生一个迭代器范围,指示出该键所关联的所有元素,如果该键在容器中存在,则会获得两个不同的迭代器

      lower_bound 返回的迭代器指向该键关联的第一个实例,而 upper_bound 返回的迭代器则指向最后一个实例的下一个位置,如果该键不在 multimap 中,这两个操作将返回同一个迭代器,指向依据元素排列顺序该键应该插入的位置

    17.泛型算法本身从不执行容器操作,只是单独依赖迭代器和迭代器操作实现

    18.使用泛型算法包含 algorithm 头文件,使用算术算法包含 numeric 头文件

    19.迭代适配器使用一个对象作为实参,并生成一个适应其实参行为的新对象

    20.算法不直接修改容器的大小,如果需要添加或删除操作,则必须使用容器操作

    21.为了以降序排列 vector ,只需向 sort 传递一对反向迭代器

    22.反向迭代器用于表示范围,而所表示的范围是不对称的

      这个事实可推导出一个重要结论:使用普通的迭代器对反向迭代器进行初始化和赋值时,所得到的迭代器并不是指向原迭代器所指向的元素

    23.类类型被称为抽象数据类型

      抽象数据类型将数据(即状态)和作用于状态的操作视为一个单元

    24.将关键字 const 加在形参表之后,就可以将成员函数声明为常量

    1  double avg_price() const;

      const 成员不能改变其所操作的对象的数据成员, const 必须同时出现在声明和定义中,若只出现在其中一处,就会出现编译错误

     25.不在类定义体内定义的 inline 成员函数,其定义通常放在有类定义的同一源文件中

     26.不能从 const 成员函数返回指向类对象的普通引用, const 成员函数只能返回 *this 作为 一个 const 引用

     27.在类的作用域外,成员只能通过对象或指针分别使用成员访问操作符 . 和 -> 来访问

     28.如果函数在类定义体之外定义,则用于返回类型的名字在类作用域之外,如果返回类型使用类定义的类型,则必须使用完全限定名

     29.必须在类中先定义类型名字,才能将它们用作数据成员的类型,或者成员函数的返回类型或形参类型

     30.构造函数分两个阶段:1) 初始化阶段 2) 普通的计算阶段   计算阶段由构造函数函数体中的所有语句组成

      不管成员是否在构造函数初始化列表中显式初始化,类类型的数据成员总是在初始化阶段初始化,初始化阶段发生在计算阶段开始之前

  • 相关阅读:
    从0开始学习自动化框架Airtest
    测试经理必知必会-Kanban和Scrum区别
    测试工程师的福音-如何使用Sonar完成代码质量检测
    看了很多文章,就这篇说明白了什么是接口测试
    测试经理必知必会:敏捷模型之Kanban
    Selenium元素定位不到?JS注入轻松搞定!
    测试经理必知必会:敏捷开发3355原则
    我知道你会冒泡排序,但是你会优化冒泡排序吗?
    快来使用Portainer让测试环境搭建飞起来吧
    给个MySQL,打算怎么测试?
  • 原文地址:https://www.cnblogs.com/zhp218/p/8605528.html
Copyright © 2020-2023  润新知