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则进行插入排序,递归程度深则使用堆排序。

      

  • 相关阅读:
    Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query
    Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了
    Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述
    Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
    Elasticsearch date 类型详解
    python 历险记(五)— python 中的模块
    python 历险记(四)— python 中常用的 json 操作
    python 历险记(三)— python 的常用文件操作
    Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
    Elasticsearch Java Rest Client API 整理总结 (一)——Document API
  • 原文地址:https://www.cnblogs.com/wshr007/p/11458784.html
Copyright © 2011-2022 走看看