合并k个有序数组,写代码
Leetcode 23题,是一道Hard题目
一个整数分解为多个不同的数之和,有几种分法,写代码
这道题也是一道较难的动态规化
介绍一下cpp的智能指针
std::move了解吗 底层实现什么样的
解释这个先要解释左值和右值
左值(lvalue)与右值(rvalue)
用一句话来概括形容就是:
左值:放在等号左边的值,可以被赋值;
右值:放在等号右边的值,不能被赋值;
比较典型的左值(以下各种运算符均是C++内建):
a
++a
*a
**a
a.m
a->m
a[m]
比较典型的右值(以下各种运算符均是C++内建):
a + b
a++
a && b
a < b
&a
深拷贝与浅拷贝
比如我们有A、B两个对象,里面均有指针指向对应内容,现在A要对B进行拷贝:
深拷贝:A先申请出一片新的空间,完全复制B的内容到新空间中;
浅拷贝:A复制B指针,将自己的指针指向B的内容地址,A、B公用一块内存地址;
所以对于深拷贝,A的修改与B没有关系;对于浅拷贝,A的修改也会在B对象也会被改变。
左值引用与右值引用
左值引用:传统的引用,形如T&;
右值引用:C++11新的数据类型,为了实现移动语义与完美转发所需要而设计出来的新的数据类型,形如T&&;
std::move()使用的意义
协助使用者进行浅拷贝,前提条件是拷贝对象需要支持移动赋值(move-assignment)、移动构造(move-constructor)。
//test.cpp
#include <map>
#include <stdio.h>
int main()
{
std::map<int, int> mapA;
mapA[1] = 1;
mapA[2] = 2;
mapA[3] = 3;
printf("addr A: %x|%x|%x\n", &mapA[1], &mapA[2], &mapA[3]);
std::map<int, int> mapB = mapA;
printf("addr B: %x|%x|%x\n", &mapB[1], &mapB[2], &mapB[3]);
mapB[4] = 4;
printf("addr new: %d|%d\n", mapA[4], mapB[4]);
return 0;
}
在STL中,这里是一个深拷贝。所以地址是完全不同的。
要进行浅拷贝,使用std::move函数
//test.cpp
#include <map>
#include <stdio.h>
int main()
{
std::map<int, int> mapA;
mapA[1] = 1;
mapA[2] = 2;
mapA[3] = 3;
printf("addr A: %x|%x|%x\n", &mapA[1], &mapA[2], &mapA[3]);
std::map<int, int> mapB = std::move(mapA);
printf("addr B: %x|%x|%x\n", &mapB[1], &mapB[2], &mapB[3]);
mapB[4] = 4;
printf("addr new: %d|%d\n", mapA[4], mapB[4]);
return 0;
}
这里是一个浅拷贝
extern c有什么用
表明变量在定义在另外一个文件中。
给了一段代码,大概是两个分配在栈上的类的对象,第二个实际上是第一个的别名,问会有什么问题。这个类成员有指针,析构函数会delete这个指针,所以出了语句块会析构两次。问怎么解决
rust了解什么
tcp的重传机制了解什么
TCP 可靠传输
1、确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传。
tcp的拥塞控制
说一下cookie和session
Session 是服务器用来跟踪用户的一种手段,每个 Session 都有一个唯一标识:Session ID。当服务器创建了一个 Session 时,给客户端发送的响应报文就包含了 Set-Cookie 字段,其中有一个名为 sid 的键值对,这个键值对就是 Session ID。客户端收到后就把 Cookie 保存在浏览器中,并且之后发送的请求报文都包含 Session ID。HTTP 就是 Session 和 Cookie 这两种方式一起合作来实现跟踪用户状态的,而 Session 用于服务器端,Cookie 用于客户端。