debug
【debug笔记】记录初次使用qt做项目的一些tip
前言:这几天学校实训,第一次接触qt的项目,也是遇到了许多的bug,在这里写一下我个人的解决方案,仅供参考。在修改时注意备份,以免造成损失。
☔ 复制以及创建项目
这个问题还是蛮常见的,当你copy一份别人的代码想在自己的项目上运行时,可能会无法运行。在拷贝他人工程时,如果代码里有后缀为.pro.user的文件,需要将此文件删除即可。此文件用于保存之前的编译环境信息。
在Qt项目中,会生成一个.pro.user文件,这个文件是用于记录用户的Qt Creator IDE设置和配置的。这些设置包括编译器、构建目录、自定义构建步骤等等。因为这些设置是与用户相关的,所以不应该被包含在项目文件中,否则可能会影响其他用户的设置和配置。
当你复制别人的Qt项目时,如果你想在自己的电脑上使用该项目,应该删除项目目录中的.pro.user文件。这是因为你的电脑上的Qt Creator IDE设置和配置可能与原项目的设置和配置不同,如果你不删除.pro.user文件,则可能会导致编译错误、构建错误等问题。
当你删除.pro.user文件后,Qt Creator会在下一次打开项目时重新生成一个新的.pr ...
刷题
【leetcode】string的相关oj
🎥字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = “11”, num2 = “123”
输出:“134”
示例 2:
输入:num1 = “456”, num2 = “77”
输出:“533”
示例 3:
输入:num1 = “0”, num2 = “0”
输出:“0”
链接:https://leetcode.cn/problems/add-strings
思路:模拟简单的加法计算。设置value1,value2,以及carry(进位)三个变量来实现此过程。
代码:
12345678910111213141516171819202122232425262728293031class Solution {public: string addStrings(string num1, string num2) { int end1=num1.si ...
linux
【linux】对权限的一些理解
这篇博客记录了linux权限的一些相关的概念与知识。
🏥 权限的概念
在多用户计算机系统的管理中,权限(privilege)是指某个特定的用户具有特定的系统资源使用权力,像是文件夹,特定系统指令的使用或存储量的限制。通常,系统管理员,或者在网络中的网络管理员,对某个特定资源的使用分配给用户不同的权限,系统软件则自动地强制执行这些权限。(以上摘自百度百科)
总的来说,Linux的权限管理是一种重要的安全特性,它可以帮助我们控制文件和目录的访问权限,从而保护系统的安全性。在Linux系统中,每个文件和目录都有一个所有者和一组权限,用于控制用户对它们的访问权限。权限掩码包括读、写、执行三个权限位,每个用户组都有一个访问权限掩码,系统会根据该访问权限掩码和用户的身份(所有者、组或其他人)来确定其访问权限。文件访问者可以分为所有者、所属组和其他人三类,文件类型包括普通文件、目录文件、设备文件、命名管道和套接字文件等。Linux系统中,共有三种表示方法来表示文件或目录的访问权限,包括数字表示法、符号表示法和字母表示法。我们可以使用chmod、chown和chgrp等命令来修改文件和目录的访问 ...
c/c++
【c++】再谈内存管理
在之前学习c语言时写过一篇内存管理,此时c++中又遇到了同样的问题,于是以此文记录c/c++中内存分配的异同点。
☀️ 在c/c++内存如何分布
在一个程序的运行过程中,总是需要存储一些数据。这些数据可以粗略的被分为:
常量数据
局部数据
静态数据与全局数据
动态申请数据
在c/c++中,内存可以分为四个区域:栈区、堆区、静态区和常量区。它们分别用于存储不同类型的数据,如下所示:
栈区:栈区是由编译器自动分配和释放的内存区域。它用于存储局部变量、函数参数和函数返回地址等。栈区是一个连续的内存块,它的大小是固定的。当程序执行离开一个函数时,栈中的内存就会被自动释放。为什么形参是实参的拷贝就与栈帧(栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。每一次函数的调用,都会在调用栈(call stack)上维护一个独立的栈帧(stack frame)。)有关,二者是通过栈帧与寄存器的一些操作来实现数据传输的。并且建立栈帧的主要目的就是存储局部的数据。
堆区:堆区是由程序员手动分配和释放的内存区域。它用于存储动态分配的对象,如new操作符创建的对象。堆区是一个不连续的内 ...
c/c++
【c++】初始化列表是怎么个事
在之前的成员函数一文中谈到过构造函数,在创建对象时,编译器会调用构造函数,为成员变量进行赋值。但这个操作并不是初始化,初始化只能有一次,而在构造函数里面是可以进行多次赋值的。初始化的工作通常可以交由初始化列表来执行。
📕 什么是初始化列表?
C++的初始化列表是一种在创建对象时初始化成员变量的特殊语法。它的存在可以显著的提高代码的可读性和性能。
在C++中,当我们创建一个对象时,我们需要为其成员变量赋值。通常情况下,我们会在构造函数中对成员变量赋值。但是,当对象中有大量成员变量时,这种方法可能会让代码变得冗长。
C++的初始化列表提供了一种更简洁、更清晰的方法来初始化成员变量。它使用冒号分隔符来定义一个初始化列表,并在其中列出成员变量及其初始值。
下面是一个类:
123456789class A{private: int a; double b;public: A(int a1,int b1) : a(a1),b(b1) {}};
在上述的代码里,使用了初始化列表来为a与b赋值而没有经过 ...
刷题
【牛客】与时间相关的程序设计题目
本篇一共有四道来自牛客网的关于日期计算的题目。
🐶 题1.HJ73 计算日期到天数转换
难度:简单
描述
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
输入描述:
输入一行,每行空格分割,分别是年,月,日
输出描述:
输出是这一年的第几天
示例1
输入:2012 12 31
输出:366
示例2
输入:1982 3 4
输出:63
本题考察日期的转换,难度简单。只需要从1月开始计算即可,需要注意的是闰年的2月有29天。
1234567891011121314151617181920int main(){ int year,mon,day; int data[]={31,28,31,30,31,30,31,31,30,31,30,31}; while(cin>>year>>mon>>day) { int sum; for(int i=0;i<mon-1;i++) { sum ...
数据结构与算法
【数据结构】单链表的实现
本篇内容为:使用c++实现单链表。
单链表(Singly Linked List),又称单向链表或者链表,是一种常用的数据结构。它由一连串的节点组成,每个节点包括两部分:数据域和指针域。数据域存储节点的数据,指针域存储下一个节点的地址。通过指针连接各个节点,从而形成链表。
单链表是一种常用的数据结构,具有动态性和空间利用率高的特点,可以应用于线性表、队列和栈等场景,并且也可以实现图的遍历和文件系统等应用。在实际开发中,需要根据具体场景选择不同的数据结构,以提高程序的效率和可维护性。下面我们将详细介绍单链表的基本概念、特点、操作及其应用。
🎍 链表的一些概念
节点:链表中的每个数据元素都被称为节点。每个节点包含两个部分:数据域和指针域。
数据域:节点中存储的数据,可以是任何类型的数据,例如:整数、浮点数、字符、结构体等。
指针域:节点中存储的指针,指向下一个节点的地址。
头结点:链表中第一个节点之前的一个节点,它的指针域指向第一个节点。
尾节点:链表中最后一个节点,它的指针域指向空地址。
空链表:不包含任何节点的链表。
🎄 链表的优缺点
随机访问:单链表不支持随机访问,只能从头 ...
c/c++
【c++】如何使用默认成员函数
在C++中,有许多默认成员函数,如默认构造函数、拷贝构造函数和析构函数等。这些默认成员函数在代码中扮演着重要的角色,它们可以帮助开发者快速构建对象、复制对象和释放对象。然而,这些默认成员函数的使用也有一些需要注意的细节和技巧。本文将详细介绍C++中的默认成员函数,包括其作用、使用方法、注意事项和实例说明等,旨在帮助读者深入了解和掌握这些重要的语言特性,从而写出更加高效可靠的代码。
🕎概览
一个类没有成员,称为空类。但一个空类却并不为空。
编译器会在其中为开发者默认生成了两大类成员函数。
构造函数:当创建一个对象时,如果没有显式地提供构造函数,编译器会自动生成一个默认构造函数。默认构造函数的主要功能是初始化成员变量,使对象能够正确地工作。
析构函数:当一个对象生命周期结束时,如果没有显式地提供析构函数,编译器会自动生成一个默认的析构函数。析构函数的主要功能是释放对象占用的资源,如释放动态分配的内存等。
拷贝构造函数:当一个对象要被复制到另一个对象中时,如果没有显式地提供拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数。拷贝构造函数的主要功能是将一个已有对象的值复制到新的对象中 ...
c/c++
【c++】相较于c,c++是如何支持重载的?
在c++中,存在一种用法,名叫函数重载,函数重载是C++中一个非常重要的特性,它允许程序员定义同名但参数列表不同的函数,这样可以方便地实现代码复用和提高程序的可读性。但在c的学习过程中,我却从未见过这样的用法,所以写了如下的一篇博客,记录c++为何支持重载的原因。
🐶函数重载
函数重载指的是在同一个作用域内,可以定义多个同名但参数列表不同的函数。例如:
如下是两个同名的add函数,功能是将两数相加并返回。
123456int add(int a, int b) { return a + b;}double add(double a, double b) { return a + b;}
虽然都是add,但是它们的参数列表不同,一个是两个整数,一个是两个浮点数。当调用add函数时,编译器会根据实参的类型和数量来选择调用哪一个函数。例如:
12int x = add(1, 2); // 调用int add(int, int)double y = add(1.0, 2.0); // 调用double add(doub ...
c/c++
【c++】c++支持的引用和c中的指针孰胜孰劣?
前言: 最近学到了c++中的引用一章,发现引用和c中所学到的指针有着很相似的效果,但在c++中仍然有着指针的一席之地,想必二者的适用场景是各有千秋,于是查阅资料,写了此文来方便日后复习。
🍐引用的基本知识
🍊概念
引用是C++中的一种数据类型,它是一种类似于指针的变量。引用可以被认为是一个变量的别名,它提供了一种访问变量的方式,使得程序员可以通过不同的名称来操作同一个变量,从而简化了代码的编写。
引用的语法非常简单,可以通过在变量名前面加上“&”符号来定义一个引用。例如,如果我们定义了一个整型变量a,可以通过以下语句来定义一个引用b:
12int a = 10;int &b = a;
这样,变量b就成为了变量a的别名,它们指向同一个内存地址。因此,对变量b的操作也会影响到变量a。
🍅引用的适用场景
引用必须在定义时进行初始化。一旦引用被初始化,它将一直指向该变量,并不能再被改变。
引用可以作为函数参数传递。通过引用传递参数可以避免复制大量的数据,提高程序的效率。
引用可以作为函数的返回值。通过引用返回值可以避免复制大量的数据,提高程序的效率。
引用可以被 ...