Q & A
1、什么是编译器?
https://blog.csdn.net/qq_34468774/article/details/103093261?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161949587616780262569786%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161949587616780262569786&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-103093261.first_rank_v2_pc_rank_v29&utm_term=%E7%BC%96%E8%AF%91%E5%99%A8%E6%98%AF%E7%B3%BB%E7%BB%9F%E8%BD%AF%E4%BB%B6%E5%90%97&spm=1018.2226.3001.4187
1)编译器是生成程序的程序,故本质上是一种程序
2)“器”是一种形象的比喻,不够严谨;而软件(software)是产品性的程序,最好只用在商业语境中;故称编译器为编译程序最恰当
3)传统定义:
编译程序是一支将抽象度较高的编程语言程序(也称源程序)【转化】成抽象度较低的编程语言程序(也称目标程序)的【程序】[注]。抽象度的两端分别是机器语义和人理解语义。【处理器体系】和【编程语言】是一支编译程序的根本属性。
4)现代意义下:
程序的“编译过程”包括编译、链接(静态链接与动态链接)、调试,还可能包括组态配置和安装两步。“编译”一词已经不能很好描述这个过程。整个过程可称为【程序构建】,而编译只是第一步,在这一点上,编译程序在传统意义上与现代意义上产生了不同。
2、什么是缺省?
缺省,即系统默认状态,意思与“默认”相同。
缺省是一种计算机术语,指在无决策者干预情况下,对于决策或应用软件、计算机程序的系统参数的自动选择。默认选项的设计可以在用户不须决策的状况下就可以基础地使用上述的软件与程序。
缺省最初来源于计算机英文文档中的单词 “default”,"default” 有很多意思:违约、缺省、拖欠、默认,由于当时计算机方面的翻译水平不高,于是就把这个词直译成了“缺省”,其实应该取它的引申意思“默认”。
3、怎么查看代码的bug
C++的error 可以大致分为两类:
- 语言层(这种会明确告诉是在哪个文件下,哪条路径,哪个函数,它出了什么错误)
- 这一部分是有那个package的作者,他加好的一些error handling的办法
- 一般情况下都会给你报,告诉你找不到可以匹配的function
- 一个可能是类型不对
- 一个是可能数量不对
- 等等
- 一个是可能数量不对
- 一个可能是类型不对
- 底层(看第一行)
- heap hebuffer overflow,就找 index,看看是不是有死循环
- stack buffer overflow,
- Undefined null pointer,说明你在访问一个空指针,或者是访问一个被GC的内存
- stack buffer overflow,
- heap hebuffer overflow,就找 index,看看是不是有死循环
就是你可以这么想,就是C++的划分,底层的和语言层的,然后与岩层的那部分L的话,他会明确的告诉你在哪个文件,哪个哪条路径的哪个函数啊?这个函数什么出了什么错啊?这是语言层它可以含的,这部分是由内部分那个package的作者,他家好的一些error handling的办法,还有一部分是底层的,L就是你现在看这种它是heap hebuffer overflow。还有一种是stack buffer overflow,还有一些是什么,Undefined null pointer这种东西是底层的错,然后底层的错的话就比较难吗?这种情况下,你就看第一行,他只要看到那个keep buffer overflow的话,你就找index data 的话,你就看看是不是有没有死循环,然后undefined什么non pointer之类的话,就说明你有一个,你有你想你在访问一个空指针,或者你在用指针去访问一个已经被GC的内存。
但是语言层面的错的话,你就需要看他是哪个文件下的哪个函数,然后因为什么原因出错,一般情况下都会给你报,告诉你找不到可以匹配的,找不到可以匹配的三个省啊,但这种情况说明你的参数太用错了,或者说你参数的,或者说你用的参数的,一个是类型不对,有可能是数量不对之类的。
4、常用英文
GC garbage collection 垃圾回收
AC all clear 全部清除
declare 声明
5、迭代器失效怎么理解呢?
vector:
- 1.当插入(push_back)一个元素后,end操作返回的迭代器肯定失效。
- 2.当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时first和end操作返回的迭代器都会失效。
- 3.当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将全部失效。
内部数据结构:数组。
随机访问每个元素,所需要的时间为常量。
在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。
可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存。
vector的迭代器在内存重新分配时将失效(它所指向的元素在该操作的前后不再相同)。当把超过capacity()-size()个元素插入vector中时,内存会重新分配,所有的迭代器都将失效;否则,指向当前元素以后的任何元素的迭代器都将失效。当删除元素时,指向被删除元素以后的任何元素的迭代器都将失效。
deque迭代器的失效情况:
- 1.在deque容器首部或者尾部插入元素不会使得任何迭代器失效。
- 2.在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效。
- 3.在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效。
内部数据结构:数组。
随机访问每个元素,所需要的时间为常量。
在开头和末尾增加元素所需时间与元素数目无关,在中间增加或删除元素所需时间随元素数目呈线性变化。
可动态增加或减少元素,内存管理自动完成,不提供用于内存管理的成员函数。
增加任何元素都将使deque的迭代器失效。在deque的中间删除元素将使迭代器失效。在deque的头或尾删除元素时,只有指向该元素的迭代器失效
list / set / map
-
- 删除时,指向该删除节点的迭代器失效
(1) list
内部数据结构:双向环状链表。
不能随机访问一个元素。
可双向遍历。
在开头、末尾和中间任何地方增加或删除元素所需时间都为常量。
可动态增加或减少元素,内存管理自动完成。
增加任何元素都不会使迭代器失效。删除元素时,除了指向当前被删除元素的迭代器外,其它迭代器都不会失效。
(2) slist
内部数据结构:单向链表。
不可双向遍历,只能从前到后地遍历。
其它的特性同list相似
(3) stack
适配器,它可以将任意类型的序列容器转换为一个堆栈,一般使用deque作为支持的序列容器。
元素只能后进先出(LIFO)。
不能遍历整个stack。
(4) queue
适配器,它可以将任意类型的序列容器转换为一个队列,一般使用deque作为支持的序列容器。
元素只能先进先出(FIFO)。
不能遍历整个queue。
(5) priority_queue
适配器,它可以将任意类型的序列容器转换为一个优先级队列,一般使用vector作为底层存储方式。
只能访问第一个元素,不能遍历整个priority_queue。
第一个元素始终是优先级最高的一个元素。
(6) set
键和值相等。
键唯一。
元素默认按升序排列。
如果迭代器所指向的元素被删除,则该迭代器失效。其它任何增加、删除元素的操作都不会使迭代器失效。
(7) multiset
键可以不唯一。
其它特点与set相同。
(8) hash_set
与set相比较,它里面的元素不一定是经过排序的,而是按照所用的hash函数分派的,它能提供更快的搜索速度(当然跟hash函数有关)。
其它特点与set相同
(9) hash_multiset
键可以不唯一。
其它特点与hash_set相同。
(10) map
键唯一。
元素默认按键的升序排列。
如果迭代器所指向的元素被删除,则该迭代器失效。其它任何增加、删除元素的操作都不会使迭代器失效。
(11) multimap
键可以不唯一。
其它特点与map相同。
6、为什么定义const pair 要放在类外?
第12题—整数转罗马数字
const pair<int, string> mp[] = {
{1000, "M"},
{900, "CM"},
{500, "D"},
{400, "CD"},
{100, "C"},
{90, "XC"},
};
// 总结:因为是大括号套大括号,所以要声明为全局变量
这个定义放在 class Solution 内部就会报错。原因大概了解一下,解释如下:
- 因为两个括号是C语言中定义 array 的办法,它在整个过程中既申请空间,又初始化里面的值。
- 但是如果你那个括号里边什么数值都没写的话,它会自动去根据你传给他的就是数值来去决定他这个申请的空间
- 但是这部分的话必须是在就是编译期间完成的。
- 所以你最好把它定义为static variable,
- 对C语言来说,所有的申请空间和释放空间都得自己来做。
- 中括号就是套 array 这个问题的话,是需要你明确告诉它,你要多大的内存,它会根据你说的数字去申请合适的空间,
- 但是这属于静态空间,就是他会申请静态内存,所以说你必须是在编译阶段完成。
- 但是这类变量的话,它申请空间,需要尽量是越静态越好,因为他只会定义以及声明一次,
- 所以说尽量用的是static的variable,就是静态变量,或者是全局变量,全局变量默认static。
7、全局变量 & 静态变量
全局变量:
申明在main函数外的变量被编译器视为全局变量。即其在整个文件的任何地方都可以使用它。
对于其他源文件来说,全局变量对其有可见性。即可以在其他源文件中通过包含此源/头文件然后通过extern关键字引用此全局变量。
静态变量:
静态变量在被申明在文件任何地方都会被视作静态变量(感觉是废话,嘻嘻),只要它被static关键字所修饰(好像还是废话)。而若想创建一个全局变量,其必须在main函数外和其他函数外被申明,否则它就不是全局变量了。
对于其他源文件来说,本文件的静态变量是不可见的,无法外部被引用。
但申明在本文件的哪个地方对本文件其他地方能否访问静态变量是有影响的。如果静态变量像全局变量一样被申明在所有函数之外,那么在本文件任何地方都能访问到此静态变量(当然要保证申明的地方在访问的地方之前)。如果静态变量被申明在某个函数中,那么在此函数外,此静态变量是不可访问的。这有点像局部变量,不过它是静态的。
全局变量&局部变量
全局变量和局部变量的存储区域不同,全局变量存放在静态数据区,局部变量存放在栈区。但还有一个小点就是存放在静态数据区的变量是由低地址向高地址存放的,但存放在栈区的变量却是由高地址向低地址存放的,存放在静态数据区的还有静态局部变量和静态全局变量。
8、最值在C++中的表示
如果是int,可以用INT_MAX表示正无穷,INT_MIN表示负无穷,需要包含limits.h。
如果是double,可以用DBL_MAX表示正无穷,-DBL_MAX表示负无穷(注意不是DBL_MIN),需要包含float.h。
9、看到两个 int 相加
此时要有一个本能的反应是,两个 int 相加,可能溢出的问题。
10、什么是 POJ
POJ是“北京大学程序在线评测系统”(PekingUniversityOnlineJudge)的缩写
11、常用的刷题网站
1、leetcode
当然题目都是英文的,现在也有了中文社区,两个网址我都放出来了,还是建议大家首刷英文的,锻炼一下,一举两得,毕竟如果是搞 ACM 的话,题目都是英文的…
中文网址:https://leetcode-cn.com/
英文网址:https://leetcode.com/
2、hihoCoder
Topcoder 据说是世界上规模最大的编程网站于 POJ 会在后面的篇章中介绍,反正膜拜就完事了。一些知名的大厂比如微软、百度、腾讯、网易等会在上面举办在线编程比赛,风格倒是和 ACM 比赛类似。
网址:https://hihocoder.com
3、牛客网
牛客网作为国内内容超级丰富的 IT 题库,各种东西看的我眼花缭乱,题库+面试+学习+求职+讨论 360 度无死角服务,堪称"互联网求职神器"。
网址:https://www.nowcoder.com/
4、计蒜客
网址:https://www.jisuanke.com/
5、HDU
杭电(杭州电子科技大学)的 OJ 大概是国内最火的几个 OJ 之一了,大多数 ACMer 应该都知道(其实我想说所有来着),勿需多说,非常多比赛都在上面,比如每年暑假的多校联赛,朝鲜、外蒙等学校的队伍都会参加,想不知道都不可能。
网址:http://acm.hdu.edu.cn/
6、POJ
网址:http://poj.org/
7、SDUT
网址:https://acm.sdut.edu.cn/
8、Topcoder
Topcoder 据说是世界上规模最大的编程网站。
网址:https://www.topcoder.com/
12、++ – 前置和后置区别
- 前置版本:首先将运算对象+1(-1),然后将改变后的对象作为求值的结果。
- 后置版本:也会将运算对象+1(-1),但求值结果是运算对象改变之前那个值的副本。
int i=0,j=0;
j=++i; // j=1,i=1; 前置版本得到递增之后的值
j=i++; // j=1,i=2; 后置版本得到递增之前的值
这两种运算符必须作用域左值运算对象,前置版本将对象作为左值返回,后置版本则将对象原始值的副本作为右值返回。
通常建议使用前置版本,避免值拷贝带来的资源浪费。
13、常见的html字符转义
No. | 文字表記 | 10進表記 | 16進表記 | 文字 | Comment | |
---|---|---|---|---|---|---|
001 | " | " | " | “”" | quotation mark = APL quote | |
002 | & | & | & | “&” | ampersand | |
003 | < | < | < | “<” | less-than sign | |
004 | > | > | > | “>” | greater-than sign | |
005 | " " | no-break space = non-breaking space |
14、数据类型的大小
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lkVi83vE-1622192802388)(C:\Users\lh\AppData\Roaming\Typora\typora-user-images\image-20210525144426136.png)]