纠正一下对cpp移动语义的错误理解
之前对于移动语义的理解就是使用std::move将一个对象所占有的资源的所有权转移给另一个对象,但是只要使用std::move就足够了吗?这显然是错误的。
C++中lambda与priority_queue一起使用
想写这篇博客的原因是在刷力扣的 347. 前 K 个高频元素 一题时,需要使用到优先队列priority_queue
,其定义如下:
1 | template< |
第三个参数是一个可以自定义的比较类型,其必须满足二元谓词,通常可以使用如下两种方法:
- 使用自定义的函数对象
- lambda表达式
- 使用
std::greater
或std::less
(这里就不介绍这种方法了)
CMake中使用find_pakage来使用MySQL
一般来说,如果我们在C++程序中要使用mysql的库,最简单的就是
1 | g++ server.cpp -o server -lmysqlclient |
但要是在大一点的项目中,在数不清的源文件下使用g++命令来完成,怕是不太现实。
Vue3封装el-upload
【链表】判断回文链表
(1)将链表转化为数组进行比较
比较呆板的做法,空间复杂度为O(n)
。
1 | class Solution { |
(2)递归
链表也具有递归性质,二叉树也不过是链表的衍生。
利用后序遍历的思想:
先保存头结点(left,全局变量),然后递归至最后(最深)的结点(right),然后比较left
和right
的值;如果相等,由递归栈返回上一层(也即right向左走),再操作left向右走,这样就实现了left和right的双向奔赴。
1 | class Solution { |
(3)优化递归
利用方法二,看似是没有使用到额外空间了,但实际上还有递归所带来的函数调用栈的开销,其空间复杂度也为O(n)
。
因此可以利用双指针的思想,找到链表的中间结点后,将其后面的结点反转。
1 | using ListNodePtr = ListNode*; |