Be Me in Real Life

做自己,笑不羁

11-1 QT和VS的项目使用

在QtCreator中创建一个项目后,例如名叫DemoPro1。为了能够使该项目在VS中运行,需要在项目目录下执行命令:

1
qmake -tp vc DemoPro1.pro

之后会生成一个“项目名.vcxproj”等文件,如“DemoPro1.vcxproj”,之后即可通过该文件使用Visual Studio运行。

11-2 QT项目的基础架构类和UI类

常用的Qt开发工具:

工具 说明
qmake 核心的项目构建工具,可以生成跨平台的 .pro 项目文件,并能依据不同操作系统和编译工具生成相应的 Makefile,用于构建可执行程序或链接库。
uic User Interface Compiler,用户界面编译器,Qt 使用 XML 语法格式的 .ui 文件定义用户界面,uic 根据 .ui 文件生成用于创建用户界面的 C++ 代码头文件,比如 ui_*.h 。
moc Meta-Object Compiler,元对象编译器,moc 处理 C++ 头文件的类定义里面的 Q_OBJECT 宏,它会生成源代码文件,比如 moc_*.cpp ,其中包含相应类的元对象代码,元对象代码主要用于实现 Qt 信号/槽机制、运行时类型定义、动态属性系统。
rcc Resource Compiler,资源文件编译器,负责在项目构建过程中编译 .qrc 资源文件,将资源嵌入到最终的 Qt 程序里。
qtcreator 集成开发环境,包含项目生成管理、代码编辑、图形界面可视化编辑、 编译生成、程序调试、上下文帮助、版本控制系统集成等众多功能, 还支持手机和嵌入式设备的程序生成部署。
assistant Qt 助手,帮助文档浏览查询工具,Qt 库所有模块和开发工具的帮助文档、示例代码等都可以检索到,是 Qt 开发必备神器,也可用于自学 Qt。
designer Qt 设计师,专门用于可视化编辑图形用户界面(所见即所得),生成 .ui 文件用于 Qt 项目。
linguist Qt 语言家,代码里用 tr() 宏包裹的就是可翻译的字符串,开发人员可用 lupdate 命令生成项目的待翻译字符串文件 .ts,用 linguist 翻译多国语言 .ts ,翻译完成后用 lrelease 命令生成 .qm 文件,然后就可用于多国语言界面显示。
qmlscene 在 Qt 4.x 里是用 qmlviewer 进行 QML 程序的原型设计和测试,Qt 5 用 qmlscene 取代了旧的 qmlviewer。新的 qmlscene 另外还支持 Qt 5 中的新特性 scenegraph 。

QApplication:是 Qt 的标准应用程序类,继承关系:

QApplication<-QGuiApplication<-QCoreApplication<-QObject;

阅读全文 »

6.1 章节导学

操作系统的演变

多道程序设计:计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制之下,相互穿插的运行。 多道程序设计可以提高CPU利用率。

对每个进程来说,它拥有自己虚拟的CPU,而实际的CPU忙于在各个进程之间来回切换。这种快速的切换运行也就是多道程序设计。

阅读全文 »

多线程基础

早期C++不支持,Win下只能使用微软提供的API。C++11之后在<thread>头文件中提供了Thread类,可以实现多线程。

线程创建和终止:

1
2
3
pthread_create (thread, attr, start_routine, arg) //线程创建(全参数)
pthread_create (start_routine, arg) //线程创建(部分参数),一般使用这种方式即可
pthread_exit (status) //线程终止
参数 描述
threa 指向线程标识符指针。
attr 一个不透明的属性对象,可以被用来设置线程属性。您可以指定线程属性对象,也可以使用默认值 NULL。
start_routine 线程运行函数起始地址,一旦线程被创建就会执行。
arg 运行函数的参数。它必须通过把引用作为指针强制转换为 void 类型进行传递。如果没有传递参数,则使用 NULL。

C++ 多线程|菜鸟教程
https://www.runoob.com/cplusplus/cpp-multithreading.html
thread - C++ reference
http://www.cplusplus.com/reference/thread/thread/?kw=thread
C++11多线程并发基础入门教程
https://zhuanlan.zhihu.com/p/194198073?utm_source=com.tencent.wework

阅读全文 »

STL标准库包括:

  • 容器
  • 适配器
  • 仿函数
  • 算法
  • 迭代器
  • 空间置配器

1. 容器

容器分为两种:

  • 顺序容器(sequence containers)
    顺序容器中的元素都是有一定顺序、可排序的,其顺序依赖于值。顺序容器包括vector、deque、list、forward_list、string、array。
  • 关联容器(associative containers)
    关联容器中的元素不可排序,全部根据键(key)的值按照某种顺序存储。set元素只有键(key),map有还值(value),元素以<key,value>存储在map中。
    阅读全文 »

迭代器(iterator)

类似于关联容器,迭代器根据两个维度——指向的元素可变(const)逆序——被分为四种迭代器。

  • 正向迭代器 iterator
  • 常量正向迭代器 const_iterator
  • 反向迭代器 reverse_iterator
  • 常量反向迭代器 const_reverse_iterator

容器对迭代器的支持:

容器 迭代器功能
vector 随机访问
deque 随机访问
list 双向访问
set/multiset 双向访问
map/multimap 双向访问
stack 不支持迭代器
queue 不支持迭代器
priority_queue 不支持迭代器
阅读全文 »

6-1 单链表逆转
https://pintia.cn/problem-sets/15/problems/724

挺基础的一道题,没有什么难点,但是要注意几种边界情况,如Reverse什么时候对链表处理,什么时候直接返回即可;如果要逆转链表,什么时候需要结束(逆转完了/不能再遍历了)?结束后有没有节点需要处理?

遇到这道题第一反应就是怎么样实现每次都能找到当前尾节点的前一个节点,想到过遍历同时保存每个节点地址到数组里等等,后来意识到其实整个过程可以一次遍历完成逆转,只需要遍历的同时进行处理即可:

阅读全文 »

7-4 List Leaves
https://pintia.cn/problem-sets/16/problems/666

这道题就是根据给定的数据建立一棵树,然后从上到下、从左到右输出这棵树的叶子节点,属于基础题。
如果做过树的一些题,这道题的“种树”(构建树)应该会很简单:只需要按顺序建立一个结构体数组,在每个结构体中保存左右节点的下标。同时看哪一个节点没有被输入过,即是树的根节点(输入的节点是不同节点的孩子节点,只有根节点没有父节点)。
后面也很简单,只需要找出所有叶子节点,然后根据题目“in the order of top down, and left to right”的要求使用BFS,遍历过程中按顺序输出这些叶子节点即可。

阅读全文 »

7-4 是否同一棵二叉搜索树
https://pintia.cn/problem-sets/15/problems/712

概述

刚开始我都忘了什么是二叉搜索树,后来简单回去看了下浙大的慕课,原来就是所有小于父节点的节点都在左边,相反所有大于父节点的节点都在右边。

浙江大学《数据结构》MOOC,4.1二叉搜索树
https://www.icourse163.org/learn/ZJU-93001?tid=1461682474#/learn/content?type=detail&id=1238255568&cid=1258682923

思路

二叉搜索树需要实现几个功能,包括:查找给定数值的某一结点,返回其指针(地址)、找出最大节点的地址、找出最小节点的地址、插入节点、删除节点等。

二叉搜索树的查找

其中比较重要的是给定某一数值,查找满足该数值的节点,返回其地址。
首先,如果给定的节点为空,直接返回,不需要查找。然后根据二叉树的定义,对于一次查找可以先将数值x和给定的节点的值node.data比较,如果相等,那么返回;如果数值x<node.data,那么递归调用自身,到左节点中进行查找;如果数值x>node.data,那么递归到右节点中进行查找。递归查找的方式如下:

阅读全文 »

7-5 Tree Traversals Again
https://pintia.cn/problem-sets/16/problems/667

思路

这道题乍看有点奇怪,感觉堆栈弹出的数字顺序比较特殊,在纸上写写画画,然后发现这是树的中序遍历。因为题目中讲“Then a unique binary tree (shown in Figure 1) can be generated from this sequence of operations”但是只有前序中序后序中的一种是不能唯一确定一棵二叉树的,至少需要两种才可以,并且题目要求输出树的后序遍历,所以大胆猜测可能堆栈的这些操作隐含了另一个次序(也就是前序)的遍历,仔细看入栈顺序,发现原来入栈顺序是前序遍历。
后面就很好办了,根据处理得到的前序遍历和中序遍历,对这棵二叉树进行重建,然后进行后序遍历就可以得到结果。

阅读全文 »

7-51 两个有序链表序列的合并
https://pintia.cn/problem-sets/15/problems/2992

这道题算是数据结构的最基础的题目,很多数据结构入门的课程里面都有它的身影。

好久没练习,导致挺简单的一题也是wrong了几次才过。
这道题遇到的几个坑:

  1. 合并链表时,对剩下的不为空链表要分情况讨论。
    剩下的不为空链表有两种可能,第一是合并剩下的,第二是压根没参与合并,因为 while (list1!=NULL && list2!= NULL) 语句直接跳过了合并的循环。这两种情况下头指针是不同的(一个为空,一个不为空)。
    如果没有考虑到这种情况,结果就是当只有一个链表为空时,程序会非法访问引发异常。
  2. 打印链表时,需要考虑到链表头指针是否为空。
  3. 仔细读题……(“若新链表为空,输出’NULL’”)
阅读全文 »
0%