zoukankan      html  css  js  c++  java
  • C++进阶知识整理

    本基本知识整理及代码源于牛客网C++面试宝典导读,

      网址https://www.nowcoder.com/tutorial/93/7047559bae6c461582560f58175faa45

      STL基本组成

      容器、迭代器、分配器、算法、仿函数、配接器。

        分配器给容器分配内存空间,算法通过迭代器获取容器中内容,仿函数协助算法完成各种操作,配接器用来套接适配仿函数。

      vector和list

      vector:

      连续存储容器,动态数组,在堆上分配空间。

      底层实现:数组。

      两倍容量增长:

      插入新元素时,如果超过容量,则会重新分配原有个数的两倍空间,将原空间元素赋值到新空间再增加新元素,最后析构并释放原空间,之前的迭代器失效

      适用:随机访问,不常在非尾节点插入删除。

      List:

      动态链表,在堆上分配空间。插入和删除都会分配或释放空间。

      底层实现:双向链表。

      适用:不能随机访问,只能快速访问头尾节点。

      resize和reserve区别

      resize:改变容器内含有元素的数量(size()),可以缩小。

      reserve:改变当前容器的最大容量(capicity()),不能缩小。

      map和set

      map和set都是关联容器,底层实现都是红黑树。map和set的接口红黑树都提供了。

      区别:

      1. map是key-value(关键字-值):关键字起索引作用,值是和索引关联的数据。set是关键字的集合。

      2. set迭代器为const,不能修改元素的值(关键字不能修改);map可以修改value,不能修改key。map和set是根据关键字排序来保证其有序。修改key则应删除键,调节平衡,再插入键,调节平衡,会破坏结构导致迭代器iterator失效。

      3.map支持下标操作,set不支持下标操作。map使用key做下标去查找,如果key不存在,则插入该关键字和值到map中。只希望确定某一关键值是否存在则应该使用find。

      迭代器

      迭代器是类模板,重载了指针的操作符部分操作符,是一个可遍历STL容器内全部或部分元素的对象,本质是封装了原生指针,提供了比指针更高级的行为,相当于一种智能指针,可以根据不能类型的容器来实现不同的++,--等操作。

      迭代器返回的是对象引用而不是值,cout智能输出迭代器使用*解引用后的值。

      迭代器访问方式就是将不同集合类的访问逻辑抽象出来,使得不用暴露内部结构而达到循环遍历集合的效果。

      STL的allocator

      STL分配器用于封装STL容器在内存管理上的底层细节。

      alloc::allocate()负责分配内存,alloc::deallocate()释放空间。对象构造由construct()负责,析构由destroy()负责。

      采用两级配置器,分配空间大小超过128b时使用第一级空间配置器,小于128b时第二级。第一级空间配置器使用malloc、realloc、free进行内存分配和释放;第二级采用内存池计数,通过空闲链表来管理内存。

      STL迭代器删除元素失效

      1.vector、deque,使用erase后,后面每个元素迭代器都会失效,后面每个元素向前移动一个位置,erase返回下一个有效迭代器。

      2.map、set,使用erase后,当前迭代器失效,不会影响下一个元素迭代器,在调用erase前记录下一个迭代器即可。

      3.list不会失效,调用erase会返回下一个有效迭代器。

      C++中类访问权限

      通过public、protected、private关键字来控制成员变量和成员函数的访问权限。在类的内部都可以互相访问。在类的外部,只能通过对象访问public属性成员,子类对象可以访问public和protected成员。

      

      C++中struct和class的区别

      strct和class都可以定义类,但struct默认权限都是public,class则是private。

      struct和class和union 内存

      struct和class内存对齐,空类的大小为1。

      类中有虚函数时,会有一个指向虚函数表的指针(vptr),32位系统下指针大小为4。

      静态数据成员是在全局/静态区,不影响类的大小。

      派生类则是基类大小加自身成员大小。

      union共享内存,所以为最大成员变量的内存。

      对齐:各数据类型对齐值不同:char对齐值为1,short为2,int float double为4。

      结构体或类自身对齐值为成员中对齐值最大的那个值。

      数据成员有效对齐值:自身对齐值和指定对齐值中小的那个值。

      

      右值引用

      右值指即将消散的值(临时变量或即将析构的对象或匿名对象),右值引用则实现了转移语义,将右值转移到其他变量上。

      主要目的:1.消除两个对象交互时不必要的拷贝,提高效率(移动构造函数)

      2.能够更简洁明确定义泛型函数。

      

      C++源文件从文本到可执行文件经历的过程

      预处理阶段:将源代码中文件包含关系(头文件)、预编译语句进行分析和替换,生成预编译文件。

      编译阶段:将预处理过的预编译文件转换成特定汇编代码,生成汇编文件。

      汇编阶段:将编译阶段生成的汇编文件转换为机器满,生成二进制可重定位文件。

      链接阶段:将多个目标文件及所需要的库连接成最终可执行目标文件。
      

      链接发生在编译、程序被加载以及程序执行时,主要工作是符号解析和重定位

      C++ 链接库

      库分为两种:静态库(.a、.lib) 动态库(.so、.dll),动态静态指链接过程。

      lib在编译时链接,而动态库在运行时链接。

      如果有dll文件,则lib记录dll中函数入口和位置,dll则是函数具体内容。

      include头文件双引号和尖括号的区别。

      区别:编译器预处理阶段查找头文件路径不同。

      使用双引号查找顺序:

      当前头文件目录

      编译器设置的头文件路径

      编译器设置的头文件路径

      使用尖括号则只包含后两步。

       

     STL里sort算法用的是什么排序算法?

      先使用快排分段,数据量小于16则进行插入排序,递归程度深则使用堆排序。

      

  • 相关阅读:
    移动端1px问题
    js几种数组排序及sort的实现
    从零开始搭建vue移动端项目到上线
    Maven项目常见错误解决方法汇总
    重读《Java编程思想》
    ubuntu开发环境下eclipse的alt+/自动补全功能不能用
    Linux环境下解压rar文件
    Ubuntu 16.04下deb文件的安装
    优化Ubuntu 16.04系统的几件事
    Ubuntu16.04 安装 “宋体,微软雅黑,Consolas雅黑混合版编程字体” 等 Windows 7 下的字体
  • 原文地址:https://www.cnblogs.com/wshr007/p/11458784.html
Copyright © 2011-2022 走看看