C/C++基础知识点(二)
文章目录
- 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++基础知识点(二)相关推荐
- Python学习笔记(基础知识点二)开更了~
下午有事忙活了几个小时现在开始开更啦. 首先想说那个一直困惑我的问题得以解决了.是什么呢??? 八进制是以数字0开头,也就是12=015(后面是八进制):十六进制是以数字0加上字母x(大写小写都可以, ...
- 类模板、变量模板、别名模板 基础知识点二
基本概念 类模板中的成员函数,只有源程序代码中出现调用这些成员函数的代码时,这些成员函数才会出现在一个实例化了的类模板中. 类模板中的成员函数模板,只有源程序中出现调用这些成员函数模板的代码时,这些成 ...
- C语言指针基础知识点(六)--通过指针引用多维数组
指针系列目录 C语言指针基础知识点(一)–指针及指针变量 C语言指针基础知识点(二)–指针变量的引用 C语言指针基础知识点(三)–指针变量作为函数参数 C语言指针基础知识点(四)–通过 ...
- C语言指针基础知识点(四)--通过指针引用数组
指针系列目录 C语言指针基础知识点(一)–指针及指针变量 C语言指针基础知识点(二)–指针变量的引用 C语言指针基础知识点(三)–指针变量作为函数参数 C语言指针基础知识点(四)–通过 ...
- C语言指针基础知识点(七)--通过指针引用字符串
指针系列目录 C语言指针基础知识点(一)–指针及指针变量 C语言指针基础知识点(二)–指针变量的引用 C语言指针基础知识点(三)–指针变量作为函数参数 C语言指针基础知识点(四)–通过 ...
- JS 基础知识点及常考面试题(二)
JS 基础知识点及常考面试题(二) 涉及面试题:== 和 === 有什么区别? 对于 == 来说,如果对比双方的类型不一样的话,就会进行类型转换,这也就用到了我们上一章节讲的内容. 假如我们需要对比 ...
- [ Azure | Az-900 ] 基础知识点总结(二) - 核心组件服务
本系列文章主要针对微软AZ-900所有知识点总结,助力通过考试,获得证书.本系列文章列表如下: [ Azure | Az-900 ] 基础知识点总结(一) - Cloud云概念 [ Azure | A ...
- 运筹学 基础 知识点总结(二)
运筹学知识点全套 第二章 预测 一.预测 预测就是对未来不确定的事件进行估计或判断.预测是决策的基础. 二.预测的方法和分类 预测的分类(内容): (1)经济预测:又分为宏观经济预测和微观经济预测 宏 ...
- MySQL基础(二)查询语句知识点汇总
查询语句知识点汇总 一.基础查询 二.条件查询 三.排序查询 四.常见函数 4.1 单行函数 4.1.1 字符函数 4.1.2 数学函数 4.1.3 日期函数 4.1.4 其他函数 4.1.5 流程控 ...
最新文章
- 【C++】模板函数的声明和定义必须在同一个文件中
- python创建txt文件并写入 编码-Python文本文件读写操作时的字符编码问题
- 认识JSON补丁:JSON-P 1.1概述系列
- Java PriorityQueue
- 使用loadrunner进行服务器性能测试(winsocket)
- Mac OS 10.12 - 如何关闭Rootless机制?
- ext2文件系统源代码之inode.c
- 数据库系统概论--第三章 关系数据库标准语言SQL
- 誉天双11直播盛典,爆款课程打骨折!
- 券商卖的雪球票息高,券商赚的什么钱?(雪球原理入门)
- include指令包含网站banner和版权信息栏
- 知乎高赞:Java和嵌入式,选哪个?
- 遗传算法五大基本要素——参数编码、群体设定
- Scrapy中scrapy.loader.processors、scrapy.contrib.loader.processor的区别
- 网络工程师课程---3、IP与路由器(ip地址的主要作用是什么)
- c语言typedef与函数
- 中国石油大学《化工设计概论》在线考试
- android蹒跚学步
- TryHackMe - Dav靶场
- 2014百度之星初赛第一轮解题报告:information
热门文章
- 打破常规,逆残差模块超强改进,新一代移动端模型MobileNeXt来了!精度速度双超MobileNetV2
- 世界上最稳定的系统——维稳就靠它了!
- 根据mysql数据库日志恢复删除数据
- openstack中手动修改虚拟机IP后不能通信
- 百度地图的实现,IIS6.0,.net4.0 无法使用POST和GET
- 如何在ubuntu上搭建hustoj?
- 学了近一个月的java web 感想
- Fix Missing Scripts
- “2011年度IT博客大赛”支持fangmin的。请投下您最宝贵的一票
- 央视是否需要cntv.com域名?