文章目录

  • 13.C++如何定义常量,常量放在内存的哪个位置?
  • 14.const修饰成员函数的目的是什么?
  • 15.以下几行代码的区别?
  • 16.隐式类型转换
  • 17.new/delete与malloc/free的区别
  • 18. RTTI
  • 19.C++如何处理返回值
  • 20.C++中拷贝赋值函数的形参能否进行值传递?
  • 21.STL有什么基本组成
  • 22.STL中set和map如何实现的?
  • 23.STL迭代器如何删除元素
  • 24.vector和list的区别

13.C++如何定义常量,常量放在内存的哪个位置?

常量在C++里的定义是一个top-level const加上对象类型,常量定义必须初始化。对于局部对象,常量存放在栈区,对于全局对象,常量存放在全局/静态存储区。对于字面值常量,常量存放在常量存储区。

14.const修饰成员函数的目的是什么?

const修饰成员函数标明函数调用不会对对象作出任何更改,事实上,如果确认不会对对象做更改,就应该为函数加上const限定,这样无论const对象还是普通对象都可以调用该函数。

15.以下几行代码的区别?

const char * arr = "123"; //字符串123保存在常量区,const本身修饰arr指向的值不能通过arr去修改,但是字符串"123"在常量区,本来就不能修改,所以加不加const都一样的。
char * brr = "123"; //字符串"123"保存在常量区,这个arr指针指向的是同一个位置,同样不能用brr去修改"123"的值。
const char crr[] = "123"; //这里123本来是在栈上的,但是编译器可能会做某些优化,将其放到常量区。
char drr[] = "123";//字符串123保存在栈区,可以通过drr去修改。

16.隐式类型转换

首先,对于内置类型,低精度的变量给高精度变量赋值会发生隐式类型转换,其次,对于只存在单个参数的构造函数的对象构造来说,函数调用可以直接使用该参数传入,编译器会自动调用其构造函数生成临时对象。

17.new/delete与malloc/free的区别

首先,new/delete是C++的关键字,而malloc/free是C语言的库函数,后者使用必须指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数。

18. RTTI

RTTI 全称:运行时类型检查。在C++层面主要体现在dynamic_cast和typeid,VS中虚函数表的-1位置存放了指向type_info的指针,对于存在虚函数的类型,typeid和dynamic_cast都会去查询type_info.

关于RTTI详细介绍请查看这里

19.C++如何处理返回值

生成一个临时变量,把它的引用作为函数参数传入函数内。

20.C++中拷贝赋值函数的形参能否进行值传递?

不能。如果是这种情况下,调用拷贝构造函数的时候,首先要将实参传递给形参,这个传递的时候又要调用拷贝构造函数,如此循环,无法完成拷贝,栈也会满。

21.STL有什么基本组成

STL主要由以下几个部分组成:容器、迭代器、仿函数、算法、分配器、配接器。
它们之间的关系:分配器给容器分配存储空间,算法通过迭代器获取容器中的内容,仿函数可以协助算法完成各种操作,配接器用来套接适配仿函数。

22.STL中set和map如何实现的?

  • set:集合。所有元素都会根据元素的值自动被排序,且不允许重复。底层实现:红黑树。
    set底层是通过红黑树(RB-tree)来实现的,由于红黑树是一种平衡二叉搜索树,自动排序的效果很不错,set以此为底层机制。并且set的所有操作接口,都是转调用RB-tree的操作。
    适用场景:有序不重复集合。
  • map:映射。map的所有元素都是pair,同时拥有键值key和实值value,pair的第一元素被视为键值,第二元素被视为实值,所有元素都会根据元素的键值自动被排序。不允许键值重复。底层实现用红黑树。
    适用场景:有序键值对不重复映射。

23.STL迭代器如何删除元素

1.对于序列容器vector,deque来说,适用erase(itertor)后,后边的每个元素的迭代器都会失效,后边的每个元素都会往前移动一个位置,但是erase会返回下一个有效的迭代器。

2.对于关联容器map,set来说,适用了erase(itertor)后,当前元素的迭代器失效,但是其结构是红黑树,删除当前元素的,不会影响到下一个元素的迭代器,所以在调用erase之前,记录下一个元素的迭代器即可。

3.对于list来说,它使用了不连续分配的内存,并且它的erase方法也会返回下一个有效的itertor,因此上面两种正确的方法都可以使用。

24.vector和list的区别

1.概念

  • vector:连续存储的容器,动态数组,在堆上分配空间,底层实现:数组。当vector增加新元素时,如果未超过当时的容量,则还有剩余空间,那么直接添加到最后,然后调整迭代器。如果没有空间了,就会重新配置原有元素个数的两倍空间,然后将原空间元素通过复制的方式初始化新空间,再向新空间添加元素,然后析构并释放原有空间,之前的迭代器会失效。
    性能:
    插入:在最后插入(空间够):很快
    在最后插入(空间不够):需要内存申请和释放,以及对之前数据进行拷贝
    在中间插入(空间够):内存拷贝
    在中间插入(空间不够):需要内存申请和释放,以及对之前的数据机型拷贝
    删除:在最后删除很快
    在中间删除:内存拷贝
    适用场景:经常随机访问,且不经常对非尾字节点进行插入删除。
  • list:动态链表,在堆上分配空间,每插入一个元素都会分配空间,每删除一个元素都会释放空间。底层实现:双向链表。
    性能:
    访问:随机访问性能很差,只能快速访问头尾节点
    插入:很快,一般是常数开销
    删除:很快,一般是常数开销
    适用场景:经常插入删除大量数据

2.区别

  • vector底层实现是数组,list底层实现是双向链表
  • vector支持随机访问,list不支持
  • vector是顺序内存,list不是
  • vector在中间节点进行插入删除会导致内存拷贝,list不会
  • vector随机访问性能好,插入删除性能差,list相反
  • vector一次性分配好内存,不够时才进行2倍扩容,list每次插入新节点都会进行内存申请

3.应用
vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随机访问,而不在乎删除和插入的效率,使用vector
list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问,使用list

C/C++基础知识点(二)相关推荐

  1. Python学习笔记(基础知识点二)开更了~

    下午有事忙活了几个小时现在开始开更啦. 首先想说那个一直困惑我的问题得以解决了.是什么呢??? 八进制是以数字0开头,也就是12=015(后面是八进制):十六进制是以数字0加上字母x(大写小写都可以, ...

  2. 类模板、变量模板、别名模板 基础知识点二

    基本概念 类模板中的成员函数,只有源程序代码中出现调用这些成员函数的代码时,这些成员函数才会出现在一个实例化了的类模板中. 类模板中的成员函数模板,只有源程序中出现调用这些成员函数模板的代码时,这些成 ...

  3. C语言指针基础知识点(六)--通过指针引用多维数组

    指针系列目录   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数   C语言指针基础知识点(四)–通过 ...

  4. C语言指针基础知识点(四)--通过指针引用数组

    指针系列目录   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数   C语言指针基础知识点(四)–通过 ...

  5. C语言指针基础知识点(七)--通过指针引用字符串

    指针系列目录   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数   C语言指针基础知识点(四)–通过 ...

  6. JS 基础知识点及常考面试题(二)

    JS 基础知识点及常考面试题(二) 涉及面试题:== 和 === 有什么区别? 对于 == 来说,如果对比双方的类型不一样的话,就会进行类型转换,这也就用到了我们上一章节讲的内容. 假如我们需要对比 ...

  7. [ Azure | Az-900 ] 基础知识点总结(二) - 核心组件服务

    本系列文章主要针对微软AZ-900所有知识点总结,助力通过考试,获得证书.本系列文章列表如下: [ Azure | Az-900 ] 基础知识点总结(一) - Cloud云概念 [ Azure | A ...

  8. 运筹学 基础 知识点总结(二)

    运筹学知识点全套 第二章 预测 一.预测 预测就是对未来不确定的事件进行估计或判断.预测是决策的基础. 二.预测的方法和分类 预测的分类(内容): (1)经济预测:又分为宏观经济预测和微观经济预测 宏 ...

  9. MySQL基础(二)查询语句知识点汇总

    查询语句知识点汇总 一.基础查询 二.条件查询 三.排序查询 四.常见函数 4.1 单行函数 4.1.1 字符函数 4.1.2 数学函数 4.1.3 日期函数 4.1.4 其他函数 4.1.5 流程控 ...

最新文章

  1. 【C++】模板函数的声明和定义必须在同一个文件中
  2. python创建txt文件并写入 编码-Python文本文件读写操作时的字符编码问题
  3. 认识JSON补丁:JSON-P 1.1概述系列
  4. Java PriorityQueue
  5. 使用loadrunner进行服务器性能测试(winsocket)
  6. Mac OS 10.12 - 如何关闭Rootless机制?
  7. ext2文件系统源代码之inode.c
  8. 数据库系统概论--第三章 关系数据库标准语言SQL
  9. 誉天双11直播盛典,爆款课程打骨折!
  10. 券商卖的雪球票息高,券商赚的什么钱?(雪球原理入门)
  11. include指令包含网站banner和版权信息栏
  12. 知乎高赞:Java和嵌入式,选哪个?
  13. 遗传算法五大基本要素——参数编码、群体设定
  14. Scrapy中scrapy.loader.processors、scrapy.contrib.loader.processor的区别
  15. 网络工程师课程---3、IP与路由器(ip地址的主要作用是什么)
  16. c语言typedef与函数
  17. 中国石油大学《化工设计概论》在线考试
  18. android蹒跚学步
  19. TryHackMe - Dav靶场
  20. 2014百度之星初赛第一轮解题报告:information

热门文章

  1. 打破常规,逆残差模块超强改进,新一代移动端模型MobileNeXt来了!精度速度双超MobileNetV2
  2. 世界上最稳定的系统——维稳就靠它了!
  3. 根据mysql数据库日志恢复删除数据
  4. openstack中手动修改虚拟机IP后不能通信
  5. 百度地图的实现,IIS6.0,.net4.0 无法使用POST和GET
  6. 如何在ubuntu上搭建hustoj?
  7. 学了近一个月的java web 感想
  8. Fix Missing Scripts
  9. “2011年度IT博客大赛”支持fangmin的。请投下您最宝贵的一票
  10. 央视是否需要cntv.com域名?