我今天开始面试了,理想很丰满,现实很骨感,武汉这边的内卷比想象的更严重。要的熟练度和知识储备也是非常的大,相较于杭州,也是醉了,心态有些裂开了。
接下来总结下第一场面试遇到的一些问题,明天在进行解答更新:
1.listwediget中如何删除选中项
这个问题源于我太久没摸过控件有些生疏了,之前都研究算法去了,没有管这些,其实很简单
就直接调用takeItem()就行了。
更多的看这个QListWedget控件使用指南-优快云博客
2.如何快速在数组中查找特定项
我当时第一个想法就是二分查找,但考虑到需要快排,他们不让使用stl,全部要自己实现,这个我明天来写一下,其实最快的方法是hash算法
3.movetothread
我之前接触的主要是qthread和qthreadpool,现在已经不用那些了,qt5就已经使用movetothread了,类继承qobject,把函数对象丢给他就行了,也是醉了,好像还有一个qconcurrent搭配feature,好像是这么写的,再研究研究,最新研究看这里
4.字符大小结构体大小
我是真没想到会考这个,平常都不注意,64位int 4字节,char 1字节,short 2字节,float 4字节,结构体的话是他里面的所有字符加起来就行了
5.connect的第五个参数以及connect的类型细分
自动用习惯了,其他的也要了解,有一个是跨线程通讯的Qdequeueconnect,跨线程通讯用这个,我之前一般用自动连接,可以显示使用这个。
连接类型 | 行为描述 | 适用场景 |
---|---|---|
**Qt::AutoConnection ** | (默认)自动选择: - 同线程 → DirectConnection - 跨线程 → QueuedConnection | 通用场景,无需手动指定连接类型 |
**Qt::DirectConnection ** | 槽函数立即执行,在发送者线程中运行。 (无论接收者对象在哪个线程) | 单线程或确保线程安全的操作 |
**Qt::QueuedConnection ** | 槽函数异步执行,在接收者线程的事件循环中排队运行。 | 跨线程通信(如更新 GUI) |
**Qt::BlockingQueuedConnection ** | 槽函数在接收者线程中运行,但发送者线程会阻塞直到槽函数完成。 | 需要同步等待结果的跨线程操作 |
**Qt::UniqueConnection ** | 按位或(|)与其他类型组合使用,确保同一信号和槽之间仅有一个连接。 | 防止重复连接导致槽函数多次触发 |
6.qset
qset的内部每个元素都是唯一的,插入重复的会自动忽略,具有无序性,内部存储顺序不固定,与插入顺序无关。基于哈希实现
常用的操作有
方法/操作 | 描述 | 示例 |
---|---|---|
insert(value) | 插入元素(若存在则忽略) | set.insert(42); |
contains(value) | 检查元素是否存在 | if (set.contains(42)) {...} |
remove(value) | 删除指定元素 | set.remove(42); |
size() / count() | 返回元素数量 | int n = set.size(); |
isEmpty() | 判断集合是否为空 | if (set.isEmpty()) {...} |
clear() | 清空集合 | set.clear(); |
unite(otherSet) | 合并两个集合(取并集) | set1.unite(set2); |
intersect(otherSet) | 求交集(保留共有元素) | set1.intersect(set2); |
subtract(otherSet) | 求差集(移除共有元素) | set1.subtract(set2); |
与其它容器的对比
容器 | 有序性 | 唯一性 | 底层结构 | 典型用途 |
---|---|---|---|---|
QSet | 无序 | 是 | 哈希表 | 快速查找、去重 |
QList | 有序 | 否 | 动态数组 | 顺序访问、随机访问 |
QMap | 按键排序 | 键唯一 | 平衡树/哈希表 | 键值对存储(需排序) |
QVector | 有序 | 否 | 动态数组 | 类似 QList,内存连续 |
7.union联合体
union里面的所有类型共享内存,他的内存大小就是内部占内存最大的那个字符,有点像那个结构体,结构体是所有类型的大小加起来,union是赋值的下一个会把上一个给覆盖掉。
8.项目经历梳理
说实话,我还是不够熟练,我自己写的项目有些细节怎么实现的我自己可能都会忘了,哭死,加班加点补