自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

gltzlike的博客

既有余心唱悲叹,何不洒酒笑长空

  • 博客(137)
  • 收藏
  • 关注

原创 尝试实现带有迭代器的 vector

两个注意点:1)底层内存分配采用 new 和 delete,非 stl 书中所示 2)移动元素为集体后移,并非原书中拆解后移(原书移动方式原因未知)#include <iostream>#include <algorithm>#include <string>using namespace std;template<class T>class MyVector{ protected: T* st...

2021-10-21 00:10:56 177

原创 6.192 定位new运算符(部分待定)

1. new new 可以开辟空间,和 malloc 类似。不过,new 可以在分配空间时进行初始化(类似于 calloc),还可以在指定内存处分配空间。具体用法见下例:#include <iostream>#include <new> // 定位new运算符使用的头文件/* 动态存储持续性:动态内存是由new和delete运算符进行控制,而不是由作用域和链接性规则进行控制 动态内存和自动内存不同,它不是LIFO(后入先出)。...

2021-09-10 00:27:01 219

原创 6.191 单独编译,存储持续性,作用域和链接性

外部链接性意味着文件间可以共享,内部链接性意味着只能在文件内部共享,无链接性就是局部变量,不可共享。 例如使用具有外部链接性的全局变量。创建 test.cpp,内容为:int global = 1000; 另创建 main.cpp,其内容如下。最终可以输出 global 为 1000。#include<iostream>using namespace std;extern int global; // 注意...

2021-09-08 20:54:50 150

原创 6.184 默认参数与占位参数

与 python 中的默认参数类似,C++ 中同样支持默认参数。默认参数是给形式参数加上默认值。如果调用函数时传入了对应的实参,就使用实参的值替换默认值,如果没有传入实参,形参则使用默认值。注意事项: 1)如果某个形参数有默认值,那么从这个位置开始,后面所有的形参都必须有默认值 2)默认参数只能从右往左添加默认值3)默认参数应该放到函数原型中,而不是...

2021-09-08 17:31:38 104

原创 6.179 引用和指针

引用的底层实现和指针常量(* const)相同,具体的区别见:https://www.cnblogs.com/this-543273659/archive/2012/07/01/2572056.html 下面的 demo 为引用的基本用法,包括数组的引用。数组指针,函数指针,数组引用定义形式都是相同的,注意类型 + (*) 或者 类型 + (&)。例如 int (*arr) [5] 和 void (*fun)(int, int) 以及 int(&rarr) ...

2021-09-07 22:30:12 54

原创 6.178 内联函数

内联函数与宏函数的区别:http://www.cnitblog.com/guopingleee/archive/2009/02/16/54625.html。 总体说来,内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。...

2021-09-07 20:48:47 63

原创 C++ 和 C 使用的不同点(待定)

1. 结构体 C 中定义的结构体,不起别名的情况下使用时要添加 struct,C++ 可以不用添加 struct,直接使用定义的结构体名称。struct Student{ int age; char *name;};// C++ 不报错,C报错Student GetName(){}// C 的写法// struct Student GetName(){// }2. xx...

2021-09-07 17:35:13 58

原创 6.143 指针习题10

关于二维数组,指针运算问题,注意二维指针需要解两次引用,即第 0 个元素是 *(*a)。见下例:#include <iostream>using namespace std;int main() { int a[3][7]; int count = 1; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 7; ++j) { a[i][j] = count++; }...

2021-09-06 15:45:08 72

原创 6.130 字符串指针和字符数组的区别

字符串指针: 1)字符串指针变量存储在栈区,其指向的字符串存储在常量区。 2)字符串指针变量存储的字符串首字符的地址,并非整个字符串 3)不能对指向的字符串做任何修改,char * 本质为 char const * 4)字符串指针变量可以做 ++ 操作 字符数组: 1)字符数组直接在栈区开辟空间(和编译器有...

2021-09-06 14:31:23 119

原创 6.118-119 普通局部和全局变量,静态局部和全局变量

1. 普通局部变量 1)代码位置:在代码块 { } 内部定义的变量,包括方法参数列表定义的变量 2)存储空间:栈内存 3)作用范围:离其最近的 { } 之间 4)生命周期:代码块执行时创建,代码块执行完销毁注意事项: 1)局部变量,不初始化时不可使用 2)同一个作用域中不能有同名的变量 3)不同的作用域中的局部变量...

2021-09-03 20:52:15 153 1

原创 6.113 指针和数组

1. *p++,(*p)++,*(p++) * 和 ++ 运算优先级相同,所以在同时出现时,需要从右向左逐次运算。以下述代码 *p++ 为例,首先应该运算 p++,由于 p++ 是使用 p 后再加 1,故 p 值不变的情况下,先执行 *p 运算,而后 p++。*p 结果为 10,故 *p++ 的结果为 10,此时 p 指向 20。 在此基础上,(*p)++ 先执行 *p 为 20,而后对 *p 进行自加,类似于 cout << i++ ,所以 (*p)++ 输...

2021-09-03 10:17:21 75

原创 6.87 C++ 数组元素反转

在不申请另一个数组的情况下,定义 i j 指标分别指向数组头和尾,然后利用中间变量,i++,j-- 遍历互换。#include <iostream>#define LEN(array, type) (sizeof(array)/sizeof(type))using namespace std;void TestReverseArray(){ int array[] = {1,2,3,4,5,6}; int length = LEN(array, int);...

2021-09-02 17:24:19 201

原创 6.84 C++ 遍历数组的几种方式

1. 计算出数组长度进行遍历 数组类型确定,数组中每个元素本身的字节大小就已经确定,利用 sizeof() 函数可以计算出数组长度,而后利用 for 循序进行数组的遍历。2. 使用类似 foreach 的方式进行遍历 C++ 中也可使用类似 foreach 的方式进行遍历,使用方法为 for(int index:array)。#include <iostream>#define LEN(array, type) (sizeof(array)/si...

2021-09-02 16:49:49 2941

原创 6.63 猜数字之生成随机数

1. 生成 [m,n] 的随机数 [m, n]的元素个数为 n-m+1,若利用模进行 %(n-m+1) 运算,其结果为 [0, n-m]。此时左右两边同加 m,其结果为 [m, n]。void TestRand(){ // 生成 [m,n] 的随机数 // rand()% (n - m + 1) + m srand(time(0)); int a = rand(); cout << a << endl;}...

2021-09-02 14:46:21 62

原创 6.46 C++ 运算符

cmake_minimum_required(VERSION 3.17)get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)string(REPLACE " " "_" ProjectId ${ProjectId})project(${ProjectId} C)set(CMAKE_C_STANDARD 11)include_directories("include")if (WI...

2021-09-02 08:25:00 93

原创 14-8 打包发布 GTK 程序

为了使 GTK 程序在他人的Windows 系统上运行,需要将该程序进行打包发布。打包程序的关键只有两步,一,将执行程序需要和动态链接库放置在同一目录;二,设置程序可以直接点击运行,不会同时启用控制台窗口。1. 放置动态链接库 1)准备工作,新建文件夹用来放置配置文件、执行程序及动态链接库。 2)使用 Listdlls.exe (微软网站下载)查看程序所依赖的动态链接库。具体做法为:在一个控制台下启动 04.config_t...

2021-08-29 21:21:02 846 1

原创 14-7 使用 css 调控样式

1. 修改前端样式可以将 ui 文件与 css 文件进行关联,类似于 html 和 css 的关系。只不过需要注意的是,前端样式可以借助 glade 进行修改,但并没有将修改应用至程序窗口,仅仅提供了预览功能。样式修改后还需要修改后台代码应用至程序窗口。后台代码获取到 css 样式文件,并将其运用到窗口程序。 前端 ui 文件与 css 文件进行关联的具体过程为: 1)点击 glade 的项目设置,设定 ui 文件链接的 css 文件目录。 ...

2021-08-29 13:52:43 288

原创 14-6 使用 glade 完成布局

1. 使用glade 新增对象及信号 前端:使用 glade 修改布局与信号。例如,在 glade 中新建对象 GtkTextBuffer,在将其 id 命名为 button2_data,内容为 “你好,中国!”。 设置构件按钮2点击信号的回调函数为 print_hello2,且在调用该函数时传入button2_data 参数。2. 实现代码与glade 新增对象及信号的链接 后端:修改代码,实现前端修改的样式。具体修改流程为: ...

2021-08-29 11:01:33 463

原创 LeetCode 155. 包含min函数的栈

【问题】定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。1. 问题分析 核心思想是将每一次进入栈中的最小值保存下来。建立两个栈,一个数据 Data 栈,一个保存目前栈中最小值的 Min 栈。Data 栈用来接收用户传入的元素。Min 栈每次将传入元素与目前栈中最小值进行对比,如果小于等于,就压入栈中。故 Min 栈存在一个性质:栈顶到栈底,元素逐渐增大,栈顶元素为最小值。...

2021-08-27 20:39:22 76

原创 14-5 使用 xml 完成布局

14-3 小节中,helloworld程序创建窗口使用代码创建。此外,也可使用 xml 完成窗口布局,代码仅仅用来处理数据逻辑,实现布局和数据处理相分离。布局的 ui 代码,builder.ui:<interface> <object id="window" class="GtkWindow"> <property name="visible">True</property> &...

2021-08-27 17:39:18 352

原创 14-4 为 GTK 应用配置主题(部分待定)

GTK 默认的主题风格是 Linux,可以将其设定为 Windows 和 Mac 相应的主题。主题设定完成后,窗口、按钮等构件的样式会发生变化。1. 全局修改 将所有样式(包括 glade 内部所有样式)进行一次性修改。修改流程如下: 1)修改配置文件,将 GTK样式设置为 Windows 样式。前往 msys 的安装路径,找到 msys\mingw64\etc\gtk-3.0 目录,打开 settings.ini 文件(如果没有就创建),写入如下内容...

2021-08-27 16:09:47 1056 2

原创 14-3 编写第一个 GTK 程序

1. 前端后端,此部分属于后端内容。如何给页面上的按钮添加点击事件。如何利用代码写一份布局。

2021-08-27 13:52:26 366

原创 初级3 题目三 如何仅用队列结构实现栈结构?如何仅用栈结构实现队列结构?(LeetCode 232, 235)

1. 2h25min,队列存入数据,start end 如何变化的,这个不能纠结

2021-08-26 21:20:04 84 1

原创 14-2 安装 GTK

注意,Windows 系统下安装 GTK 利用的是 msys,这意味着后续所有代码只能依靠 mingw 编译器实现,不能使用 msvc。 具体安装流程如下: 1)打开 msys2.exe,输入以下代码:pacman -S mingw-w64-x86_64-gtk3 2)打开 mingw64.exe,查询编译环境中是否含有GTK 相关的包。输入如下代码。pkg-c...

2021-08-25 15:56:45 439

原创 14-1 GUI 开发概述

图形用户界面 GUI(Graphical User Interface)的编程情况大致如下。其中 GTK 扩展到了 Windows 和 Mac 系统,Qt 框架偏重于 PC 端开发,而 Flutter 偏重于移动端的开发。只要添加一个中间层,可以轻松将 GTK+ 应用至其他语言。(注意,GTK 和 GTK+ 是两种事物)...

2021-08-25 15:20:27 302

原创 13-6 使用 C++ 调用 C 程序

在 C++ 工程下,调用C 语言书写的函数,其具体流程如下: 1)准备工作,创建 C++ 工程 06.call_from_cpp,其中需要引入两个头文件,一个头文件利用 C 语言实现,一个头文件利用 C++ 语言实现。 06.call_from_cpp.cpp 文件内容为:#include <iostream>#include "factorial.h"#include "fibonacci.h...

2021-08-25 14:38:45 294

原创 13-5 使用 Conan 管理依赖

1. Conan 的安装 类似于 Java 使用 maven 管理依赖,C/C++ 可使用 Conan 进行依赖的管理。 安装 Conan 非常简单,在安装完成 python 的前提下,使用 pip install conan 即可进行 Conan 的安装。安装完成后,在控制台下输出 conan 可以查看相应的命令使用方法:2. 利用Conan 引入 libcurl 1)首先需要安装相关依赖,以 libcurl 为例。在主工程...

2021-08-25 11:40:12 1006

原创 13-4 使用 CMake 完成库的编译和链接

在正常生产过程中,很少使用命令行编译和运行静态链接库和动态链接库,而是使用 CMake 完成静态链接库和动态链接库的编译。 以 04.library_with_cmake.c 为例,将子工程 fibonacci 编译为动态链接库,子工程 factorial 编译为静态链接库。 04.library_with_cmake.c 的内容为:#include <stdio.h>#include "factorial/factorial.h"#include ...

2021-08-24 16:55:50 1128

原创 13-3 动态链接库的编译和使用

1. 静态链接库与动态链接库 由于静态链接库不能共享,且依赖的符号的对应目标文件与主程序文件需要一同编译,故静态链接库内存空间占用较大。而动态链接库具有共享性质,通过特定路径即可引用,可以有效减少内存空间的占用。 此外,可使用 ldd 命令查看一个可执行程序所依赖的动态链接库。2. 编译动态链接库以主程序文件03.shared_library.c 为例,编译运行时需要的动态链接库,便于后续外部函数的执行。此主程序文件与上一小节的主程序文件内...

2021-08-24 00:42:30 1518

原创 13-2 静态链接库的构建和使用

1. 静态链接库与动态链接库 程序编译时发生的动作称为静态行为,程序运行时发生的动作称为动态行为。故链接共分为两种,静态链接和动态链接。目前来看,链接使用的原因在于,主程序文件执行时需要引入头文件,执行外部函数。而引入头文件时,在编译阶段确定外部函数的地址还是在运行阶段确定外部函数的地址,由此产生了静态链接和动态链接两种方案。静态链接是在编译阶段确定外部符号地址,并将依赖的符号其对应的目标文件与主程序文件一同编译,形成最后的可执行程序。动态链接是在程...

2021-08-23 22:33:02 189

原创 13-1 可执行程序的编译过程

1. 编译流程 使用 gcc 编译器,将源代码 .c 文件一步一步编译至可执行程序。gcc 编译器在 Windows,Linux,Mac 均可正常编译。编译具体过程如下: 1)打开msys 目录下的 mingw64.exe,跳转至待编译源码的目录。 2)利用预处理器,将 .c 源代码文件转为 .i 宏替换后的源代码文件。gcc 编译器中输入以下代码实现宏替换。注...

2021-08-23 19:30:57 285

原创 12-10 案例:并发任务执行与函数回调

1. 问题来源 使用多线程进行文件下载,下载功能的实现由线程睡眠模拟,下载进度在控制台进行查看。 此问题可使用一个主线程与多个子线程解决。其中主线程功能为:1) 查看各子线程的下载进度2) 查看剩余的待下载任务数量子线程功能为:1) 执行下载任务2) 下载任务完成后,发出通知,执行回调函数#include...

2021-08-23 14:46:21 152

原创 12-9 案例:处理复杂的线程返回结果

1. 问题来源 thrd_create() 函数功能为新建一个线程,传入待执行的函数。待执行函数的格式要求如下:typedef int (*thrd_start_t)(void *arg);这意味着待执行函数只能返回 int 类型值,接收 void* arg 参数。若待执行函数想要返回一个结构体,该如何操作?2. 解决方案 解决方案一:由于返回值为 int 类型,指针的本质也是一串数字,所以可将结构体指针进行返回,从而返回结构...

2021-08-23 08:58:18 93

原创 12-8 副作用与纯函数

1. 副作用函数副作用:指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量)或修改参数。表达式副作用:在表达式求值过程中,需要获取变量的值,但并不改变这些变量的值,这样的表达式称为无副作用的表达式。一个表达式在求值过程中,对使用的变量不但引用,对它们的值还加以改变,这样的表达式称为有副作用的表达式。例如 count++,表达式获取的是 count 值,但在获取过程中对 count 变量的值进行了加 1 操作,故此表达式是有...

2021-08-22 23:29:30 215

原创 12-7 Thread Local 线程变量(部分待定)

1. _Thread_local _Thread_local 可以将指定变量当做线程的内部变量,避免线程之间的变量共享。以 12-3 节的 count++ 为例,若 count 变量是每个线程内部的变量,则不会出现线程安全问题。故将代码修改如下:#include <stdio.h>#include <tinycthread.h>// 创建线程生命周期的变量 main_count,线程结束时自动释放_Thread_local int main_count...

2021-08-21 23:10:37 142

原创 12-6 锁

加锁可保证原子性操作和共享资源的可见性,但加锁成本相对较高。 mingw 编译器下,可用 mtx_t 定义一个锁,mtx_init() 函数初始化一个锁,mtx_destory() 函数销毁一个锁,mtx_lock() 函数加锁,mtx_lock() 函数解锁。mtx_timedlock() 函数和 mtx_lock() 函数功能类似,mtx_lock()函数加锁不成功时会一直等待,而 mtx_timedlock() 函数加锁不成功时可设置等待时间。mt...

2021-08-21 18:10:27 333

原创 12-5 原子类型

1. atomic_int 12-3 中线程安全问题来源之一为非原子操作,而利用 C11 新增的 atomic_int 类型,其定义的变量的相关操作均为原子操作。修改12-3 第 1 小节的部分代码,将 int count = 0; 改为 atomic_int count = 0。程序最终结果为 count 等于2000000,与12-3 第 1 小节的情况截然不同。 但目前仅 gcc 编译器支持 <stdatomic.h>,msvc 不支持。#...

2021-08-21 16:26:18 1209

原创 12-4 volatile

1. 使用情况 volatile 与 12-3 中的代码重排序有关。在 12-3 的第三小节,由于添加set(CMAKE_C_FLAGS "-O3") 导致编译器对汇编指令进行了优化。此时可使用volatile 关键字,确保被修饰的变量对应的汇编指令不被优化。#include <stdio.h>#include <tinycthread.h>int flag = 0;int a = 0;int x = 0;int T1(vo...

2021-08-17 17:09:37 59

原创 12-3 资源的线程安全问题

1. 线程安全问题的来源之一 ——对共享资源进行非原子操作的修改 使用两个线程执行 Counter 函数,对 count 变量分别自加 100 万次,最后结果为 1049042,并非 200 万。 原因在于 count++ 操作并非原子操作。count++ 操作可拆解为 3 步:int temp = count,count = temp + 1,returntemp。线程 1 执行完第一步,还没执行第二步时,线程 2 可能此时已经开始执行第一步,即 temp = co...

2021-08-17 16:03:56 89

原创 2-1 编译型语言

1. 编译语言的层次和类型 机器语言,汇编语言,编译型语言,解释型语言,脚本语言。 编译型语言一般需要经历编译和链接的过程,才能变成真正的可执行程序。编译链接的过程如下图所示。...

2021-08-17 08:55:10 68

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除