转载自:计算机视觉life
1、 如果你来设计vector,你会怎么设计?
根据容器特性需要满足:
1.顺序序列
顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
2.动态数组
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。
3.能够感知内存分配器的(Allocator-aware)
容器使用一个内存分配器对象来动态地处理它的存储需求。
————————————————
版权声明:本文为CSDN博主「casgj16」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/casgj16/article/details/80400228
2、给你一个vector,求第k大的那个元素。
#include<bits/stdc++.h> (万能头文件)
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
sort(nums.begin(),nums.end()); //从小到大 ,调用C++函数
return nums[nums.size()-k];
}
};
int main() {
vector<int> nums = { 3, 2, 1, 5, 6, 4 };
Solution *pSolution = new Solution;
int i = pSolution->findKthLargest(nums, 2);
cout << i << endl;
system("pause");
return 0;
}
// 原文链接:https://blog.csdn.net/casgj16/article/details/80400228
3、C++函数指针有哪几类?函数指针、lambda、仿函数对象分别是什么?
//1 定义:每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针
//2.语法:*指向函数的指针变量的一般定义形式为:数据类型 (指针变量名)(参数表);
指针的代码详解链接: https://blog.csdn.net/CSU_hjh/article/details/106925048
C++函数指针有1.成员函数指针、2.静态函数指针、3.全局函数指针。
函数指针:指针指向普通的函数对象
lambda: C++11后支持的匿名函数对象,可捕获函数域外的变量
仿函数对象:仿函数是STL的6大组件之一,Allocator, Algorithm, Adapter, Container, Functor(function objects), Iterator
仿函数对象:重载了"()"运算符的对象
Details:
函数指针是指针,不是函数,指针只是一个变量。
举例:int (*fp) (int a, int b); fp = test;
模板:函数返回类型 函数指针变量名 函数类型形参列表
使用: typedef int (*fp) (int a, int b); fp f =test
指向类成员函数指针指向类中的非静态类成员函数
对非静态成员函数,取地址,获得该函数在内存中的实际地址
对于虚函数,其地址的编译时期是未知的,所以对于虚成员函数取其地址,所能获得的只是一个索引值
4、智能指针分哪几种?std::unique_ptr, std::shared_ptr, std::weak_ptr各有何用途?
因为C++使用内存的时候很容易出现野指针(一些内存单元已经释放,但是之前指向它的指针还在被使用)、悬空指针(有多个指针都指向了同一个对象,其中一个指针删除了对象后,其余指针就变成了野指针/悬垂指针)、内存泄露(应该释放的没有被释放)的问题。所以C++11引入了智能指针来管理内存。
分为auto_ptr、unique_ptr、shared_ptr和weak_ptr四种:
** auto_ptr,实现了独占式拥有的概念,同一时间只能由一个只能指针可以指向该对象;但auto_ptr已经被C++11放弃;
** unique_ptr:独占式指针,同一时刻只能有一个指针指向同一个对象,不支持复制和赋值。但是可以移动;
** shared_ptr:共享式指针,同一时刻可以有多个指针指向同一个对象,支持复制和赋值和移动;
** weak_ptr:用来解决shared_ptr相互引用导致的死锁问题;
参考地址:https://blog.csdn.net/zhizhengguan/article/details/112302192
5、在C++语言中,引用(&)与指针(*),在功能和使用上的相同点和不同点是什么?
引用是对象的别名,实际上和原始对象是同一个对象,没有实际地址,不是原始对象的拷贝。所以引用作为函数参数时,传参无须拷贝,提高了效率,另外引用还会改变实参。
**功能上的相同点:
1. 都是地址的概念:指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
**功能上的不同点:
1. 指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元,可以定义指向指针的指针。而引用仅是个别名,没有实际地址,所以不能定义指向引用的指针,也不能定义指向引用的引用。
2.作为函数参数:(1)指针作为函数参数时,形参实际上是实参的一份拷贝,只是分别属于两个不同的指针变量。
(2)引用作为函数参数时,传参无须拷贝,提高了效率,另外引用还会改变实参。
**使用上的相同点:
**使用上的不同点:
2. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
3. 引用不能为空,指针可以为空;
4. 引用使用时无需解引用(*),指针需要解引用;
5. 引用只能在定义时必须被初始化,且被初始化一次,之后不可变;指针可变;
6. 指针和引用的自增(++)运算意义不一样;(引用的++(自增运算)是其指向的对象本身的运算,而指针的++是内存地址的++);
7. 指针和引用的自增(++)运算意义不一样;(引用的++(自增运算)是其指向的对象本身的运算,而指针的++是内存地址的++);
8. 指针和引用的自增(++)运算意义不一样;(引用的++(自增运算)是其指向的对象本身的运算,而指针的++是内存地址的++)
6、
1. 传递引用和传递值的区别?
答:(1)按值传递不会改变实际参数的数值;
(2)按引用传递可以改变实际参数的内容,但不能改变实际参数的参考地址。
2.传递常引用和传递引用之间的区别?
3.传递右值引用和传递引用之间的区别?
7、C++多线程中进程间通信的手段有哪些?
线程间通信的三种方式:共享内存、管道通信(Linux)、future通信机制
1.共享内存
多线程会共享全局变量区,所以可以多个线程去option 这个临界区的XXX;
但是通常 共享内存会引发不安全的结果 ==》所以就有了一些保护机制:互斥锁mutex、条件变量cv、原子操作和线程局部存储等。
2.管道通信(Linux)
如:
int fd[2];
pipe(fd);
将int fd[2]置为全局,fd[0]为读端口 另一个为写端口。
就可以:一个线程向fd[1] write,一个线程向fd[0] read。
Note:与进程间通信的不同,进程间通信时,子进程会copy父进程的fd,故两端要各关闭一个读写。
3.future通信机制
原文链接:https://blog.csdn.net/Carl_0/article/details/98882385
8、说一下C++多态的实现原理。
简而言之就是 用父类的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数,通过这种方法,可以让父类的指针具有多种形态,也就是说不需要改动很多的代码就可以让父类这一种指针,实现一些很多子类指针的功能,这里是从虚函数的实现机制层面进行研究。
参考文章: https://www.jb51.net/article/162078.htm
9、C++的构造函数可以是虚函数吗?
不能。
1. 从内存的角度看:
虚函数对应一个虚函数表,虚函数表是存储在对象的内存空间中的。而调用虚函数使用过调用虚函数表来实现的。
**如果构造函数是虚函数,那么就需要通过虚函数表来调用,但是对象是通过构造函数实例化的,在调用构造函数之前,,虚函数表内存空间还没有被创建,无法找到虚表。**所以构造函数不能是虚函数。
2.从使用的角度看:
虚函数是通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。,但是构造函数是通过创建对象时自动调用的,不可能通过父类的指针或者引用去调用,所以规定构造函数不能是虚函数.
原文链接:https://blog.csdn.net/weixin_43471255/article/details/125492336
10、虚函数有什么作用,析构函数为什么定义为虚函数?
1. 虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
2. 如果不需要基类对派生类及对象进行操作,则不能定义虚函数,因为这样会增加内存开销.当类里面有定义虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间.所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数.
11、C++中static静态变量有什么作用,在什么情况下会用?
1. 作用:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。
2. 使用场景:需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见
原文链接:https://blog.csdn.net/weixin_52244492/article/details/123775881
12、类中的this指针指向哪里?
13、说一下const的作用。
14、std::string类型为啥不能memset?
15、emplace_back( )和push_back( )有什么区别?
16、写一个Vec2d类,支持加、减、数乘、数除等操作。
3733

被折叠的 条评论
为什么被折叠?



