C++应用积累
文章平均质量分 74
三公子Tjq
三少爷的剑:剑气纵横三万里,一剑光寒十九洲!
展开
-
C/C++程序编译成可执行程序步骤图文源码详解
一个C++程序被编译为目标程序的过程中经历了四个部分,分别是预处理、编译、汇编、链接。下面将通过一个简单的C++代码分别执行预处理、编译、汇编、链接四个步骤后的结果和基本原理讲解。注意:博主是在ubuntu20.0下编译和运行,g++版本是9.3.0一、一个简单的C++代码下面是一段简单的C++代码Test1.h#ifndef TEST1_H_#define TEST1_H_struct Test1{ Test1(); int getVar() co原创 2021-08-27 23:59:03 · 3825 阅读 · 0 评论 -
蛇行字符串解题代码C++
一、题目描述输入一个字符串(不含空格), 请寻找输入中包含所有蛇形字符串。蛇形字符串定义:1.蛇形字符串由连续字符对组成,其特点如下:1.1 字符对定义:字符对由同一字母的大写和小写组成(前大后小)。如:Aa,Dd;1.2 蛇形字符串中包含的字符对,必须是连续字母,并按照字母顺序排序。如:AaBbCc或OoPpQqRrSs;2.从输入中寻找字符组成蛇形字符串(字符顺序不限),符合规则:2.1 每次寻找必须是最长的蛇形字符串;2.2 使用过的字符不能重复使用;例: 输入SxxsrR^AaSs原创 2021-06-06 01:17:37 · 1240 阅读 · 0 评论 -
OJ系统输入转为字符串char*或者std::string处理(力扣Leecode和牛客网 C++,std::getline,cin.getline)
起始主要用到输入函数std::getline(…)或者cin.getline(…)。由于std::getline(…)支持std::string输出和cin.getline(…)输入是char*,所以本文主要讲std::getline(…)。一、std::getline原理和用法1.1 std::getline参数解析std::getline有两个版本,分别如下代码所示: // (1)istream& getline (istream& is, string& str,原创 2021-06-05 00:59:34 · 375 阅读 · 0 评论 -
C++字符串数组转整形数组vector<int>(vector<int>& strsToIntVector(const string& str))
本文主要总结一个C++字符串数组转整形数组的函数void strsToIntVector(const string& str, vector<int>& vs, const string& sp =" "),即```cppvoid strsToIntVector(const string& str, vector<int>& vs, const string& sp =" "){ ... }```# 一、函数原理和用法## 1.1函数参数详解```cpp/* @para1 str : 待分割原创 2021-06-04 23:57:57 · 1670 阅读 · 1 评论 -
《STL 源码剖析》——空间配置器alloc
栈和队列是应用最多的数据结构之二,有数组实现和链表实现两种方式。当需要对容器做出限制,只允许一边插入和取出数据时,则需要用到栈。下面将总结数组实现的栈和阐述其原理。一、线性表——栈Stack1.1栈Stack定义栈是一种特殊的线性表,其插入(也称为入栈或压栈)和删除(也称为弹出或出栈)操作都在表的同一端进行;该插入和删除的端口称为栈顶(top),另一端称为栈底(bottom)。1.2栈的基本运算1.2.1基本运算(1) 初始化(构造一个空的栈)(2) 计算栈长度(栈中节点个数)(3) 插入节原创 2021-04-03 23:59:08 · 1238 阅读 · 7 评论 -
直接插入排序算法总结(C++代码、Qt)
直接插入算法是一种稳定的(排序前后相同元素相对位置保持不变)排序算法,空间复杂度是,最坏时间复杂度是。一般用在数组基本有序或者数据规模很小的时候非常高效。直接插入排序主要思想是将一个数组分为有序数组和无序数组,然后将无序数组依次插入有序数组中,插入的时候,从无序数组的左边第一个数开始,往有序数组的右边第一个数从右到左插入;当待插入数据小于插入数据时,则该有序数组该位起的右边所有数据,依次向右移动一...原创 2019-10-29 22:27:24 · 688 阅读 · 0 评论 -
大根堆排序算法(C++实现、Qt)
堆排序算法是一种选择排序,主要思想是选好一个非叶子节点子树,然后用该子树较大的孩子跟父节点比较,较大者跟父节点交换。如果交换后,孩子节点不满足大根堆排序,则交换依次后,用交换的孩子作为根节点,对该孩子进行大根堆排序,直到所有孩子节点全部满足大根堆排序,然后才继续往上一层节点继续比较排序;下图是对大根堆排序原理图文动态讲解,引用这篇博主(https://blog.csdn.net/LoveHYZ...原创 2019-10-28 23:54:40 · 1578 阅读 · 0 评论 -
C语言枚举enum基本用法
1.1枚举enum定义和调用enum枚举最基本的用法是作为一个自定义的常量集合,比如enum ENUM{val1,val2,val3} Enum ;定义完后,可以直接把ENUM作为一个新增数据类型,可以当成int数据类型来用。下面是一个枚举类型enum的定义和调用示例:enum EVal{val1,val2} Val;void Widget::on_pushButton_6_clic...原创 2019-07-04 16:34:28 · 6168 阅读 · 0 评论 -
STL关联容器set、multimap基本用法1(C++)
STL具有容器概念和容器类型。概念是具有名称(如容器、序列容器、关联容器等)的通用类别;容器类型时可用于创建具体容器对象的模板。旧的容器有11个,分别为deque、list、queue、priority_queue、stack、vector、map、multimap、set、multiset和bitset。博主主要总结的是关联容器set和multimap基本用法,其它容器的原理和用法可以参考《...原创 2019-07-10 23:44:54 · 432 阅读 · 0 评论 -
重载操作符operator=()简单用法(类对象初始化方法之一:给对象赋值)
用C++重载操作符operator=()可以给一个该类的对象赋值,把这个对象当成整数一样来赋值。下面是具体的用法示例#include <windows.h>#include <QDebug>class NC{public: BYTE b=5; NC() {} NC & operator =(const BYTE &va...原创 2019-07-11 15:35:35 · 1012 阅读 · 0 评论 -
C++读写文件操作(fstream、ifstream、ofstream、seekg、seekp、tellg、tellp用法)
本文主要总结用C++的fstream、ifstream、ofstream方法读写文件,然后用seekg()、seekp()函数定位输入、输出文件指针位置,用tellg()、tellp()获取当前文件指针位置。一、核心类和函数功能讲解fstream:文件输入输出类。表示文件级输入输出流(字节流);ifstream:文件输入类。表示从文件内容输入,也就是读文件;ofstream:文件输...原创 2019-07-15 23:47:44 · 5791 阅读 · 1 评论 -
V141未安装错误
博主github下载一个demo,是用vs2017开发的。博主用的是vs2015IDE,编译时出现错误:V141未安装错误,具体错误如下所示...........................(晚点补图)1.1错误原因V141编译器是vs2017自带的编译器,在vs2015是V140,两个不同版本编译器编译同一个项目所以出现编译错误。1.2解决办法解决办法有两种。第一种是安装...原创 2019-07-18 11:44:14 · 7089 阅读 · 0 评论 -
用C++标准库函数std::euqal()替换C语言字符比较函数strcmp()(比较两个字符串是否相等函数)
C++标准库函数std::euqal()功能比C字符的比较函数strcmp()强大和广泛。std::euqal()的功能是比较两个容器或者数组是否相同,数组的类型可以是char*、BYTE等常用基本数据类型。当需要比较两个字符串或者字符数组是否相等时,可以用std标准库函数equal()函数替换strcmp。1.1 std::euqal()函数声明和定义/** * @brie...原创 2019-07-11 23:01:00 · 1324 阅读 · 0 评论 -
STL算法之函数对象(函数符)基本用法
函数符是通过重载小括号(),即operator()来实现的,声明和定义跟重载operator+等运算符类似。函数符概念定义如下:生成器(generator):不用参数就可以调用的函数符; 一元函数(unary function):用一个参数就可以调用的函数符(比如for_each(),每次用于一个容器元素); 二元函数(binary function):用两个参数就可以调用的函数符;...原创 2019-07-11 23:06:40 · 538 阅读 · 0 评论 -
C++添加简单单词字典和按字母排序实例(应用STL容器set、map、vector、iterator)
下面是一个C++添加简单单词字典和按字母排序实例总结代码。该例子用到了STL容器中的set、map、vector、iterator,具体代码如下:#include <iostream>#include <string>#include <vector>#include <iterator>#include <algorithm...原创 2019-07-11 23:39:39 · 1846 阅读 · 0 评论 -
结构体struct(或类class)占用结构空间总结
结构体占用的内存空间跟类一样,区别只在于结构体成员默认是public,而类默认是private。1.1占用空间解析结构体中构造函数、成员函数、析构函数是不占用内存空间的,只有成员变量才占用结构体的内存空间。当然还有一个虚函数也会占用四个字节地址空间。枚举类型占据四个字节,范围为4294967296足够用了,不够需要扩充,一般很少这种情况。结构体内的结构体占的内存空间的对齐方式,是按照该...原创 2019-07-16 15:37:46 · 4629 阅读 · 0 评论 -
C++函数返回类型后置用法(decltype)
常用的函数返回类型一般是在前面即void function();。但是C++11新增了语法,函数返回类型声明后置,在函数名和参数列表后面返回指定类型。C++函数返回类型后置一般用于模板函数中,可以提前返回编译器还没编译开始的类型。#include <iostream>//编译器在遇到f3的参数列表前,T和U还不在作用域内,因此在参数列表后使用decltypetemplate...原创 2019-07-16 18:44:00 · 3235 阅读 · 0 评论 -
Qt5.9调用Windows的匿名管道总结
匿名管道一般用于两个父子进程之间的通信,通常是在MFC上调用。在Windows上,匿名管道的调用函数为CreatePipe(),具体的原理讲解和调用实例,可以参考博主的这篇博客:https://blog.csdn.net/naibozhuan3744/article/details/83142860。本博客主要总结在Qt下调用Windows系统函数CreatePipe()创建一个管道,然后启动...原创 2018-10-19 16:47:05 · 2955 阅读 · 0 评论 -
Qt中QMap键值对基本用法(键值对)
本文主要总结Qt中键值对QMap的基本用法。1.1原型讲解QMap是一个键值对类,跟标准C++的map类基本类似,声明原型如下:QMap<T1,T2> map1T1为键值对中的键key,T2为键值对中的值。通过键值对中的键可以搜索到值。一般来说,键值对中的键是唯一的,不可重复,而值没有要求,可以重复。并且QMap具有自动排序功能,对输入的键进行排序。1.2下面是一...原创 2019-08-07 15:46:45 · 67467 阅读 · 0 评论 -
C/C++在声明一个指针时初始化为nullprt(delete后奔溃、释放空指针)
1.1C/C++在声明指针规范C/C++在声明一个指针时,一定要附初始值为nullprt,并且释放的时候也要把其值赋值为nullprt。这样做的好处是可以用当前指针是否为nullprt来判断是否分配了内容。这是博主血泪教训,千万要遵循C++默认准则,否则释放一个空指针,会导致程序奔溃!!! BYTE *p2=nullptr; if(p2) //判断是否为空指针nu...原创 2019-08-02 09:59:11 · 3209 阅读 · 0 评论 -
C++内存对齐简单用法(预编译指令#pragma pack(1))
C语言和C++都有内存对齐,当定义一个结构体时,如果不指定内存对齐方式,则会按照默认的最大元素内存对齐。C++中,内存对齐用编译头指令#pragma pack(N),N代表N个字节对齐。如果N的值为零,则自动恢复原来系统内存对齐。下面是一个实例,按照一个字节内存对齐void Widget::on_pushButton_2_clicked(){#ifndef DE#define DE...原创 2019-07-23 14:52:21 · 836 阅读 · 0 评论 -
C++可变参数模板函数基本用法
可变参数模板可以创建任意个参数的模板函数和模板类,本文主要介绍可变参数模板函数。1.1可变参数模板函数声明和定义template<typename... Args> //Args是一个模板参数包void Show(Args... args) //args是一个函数参数包{ //函数功能 return;}由上面代码可知,Args是一个模板参数...原创 2019-07-17 23:08:32 · 3929 阅读 · 0 评论 -
C++11 lambad函数(lambad表达式)基本用法
C++11新增了lambda函数,也称为lambda表达式。lambda表达式主要作用是让我们能够将类似于函数的表达式用作接受函数指针或者函数符的函数的参数。如果不知道函数符含义,可以参考博主这篇博文:https://blog.csdn.net/naibozhuan3744/article/details/955299161.1 lambda表达式声明和定义如下void Functi...原创 2019-07-17 20:16:58 · 3527 阅读 · 0 评论 -
C++智能指针模板类auto_ptr、unique_ptr、shared_ptr基本用法
智能指针主要作用是可以自动释放动态内存new分配的内存,不需要手动delete这些new分配的内存。(注意:一定要new申请的内存才能用智能指针自动释放,否则智能指针很可能无效)一般情况用智能指针shared_ptr和unique_ptr,尽量不要用auto_ptr。假如有用auto_ptr的地方,一般可以用unique_ptr替代。其中智能智能unique_ptr为独占,表示获取得到赋值指针...原创 2019-07-09 23:20:47 · 714 阅读 · 0 评论 -
模板类vector和迭代器iterate基本用法(标准模板库STL)
模板类vector和迭代器iterate是标准模板库STL中的容器和迭代器两部分内容(STL:提供了一组表示容器、迭代器、函数对象、算法的模板),容器相当于数组,存储了所有typename中的对象;而迭代器相当于一个自动类型推断指针,该指针可以遍历容器内的所有对象。下面将总结一个用迭代器遍历容器的典型用法和对容器所有对象进行简单升序排序。1.1基于自动类型推断auto和容器起始vector::...原创 2019-07-09 22:57:32 · 1404 阅读 · 0 评论 -
C++中控制cout输出两位小数点精度(显示固定位数十六进制数,前面补零)
使用cout输出时,想要控制输出的格式,比如显示两位小数、显示十六进制数、全部显示大写字母、输出十六进制数时带0x,这些都可以用标准函数库std中的setf()来完成,即使用cout.setf()。当然,如果显示十六进制数,也可以使用std::hex来控制。下面对函数cout.setf()原型进行讲解和给出两个简单例子,第一个例子是显示两位小数,第二个例子是显示固定位数十六进制数,不足位数补零...原创 2019-07-12 22:34:12 · 7950 阅读 · 3 评论 -
C风格遍历一串字符串的简单用法(基于指针的方法)
本文主要总结一个C风格用指针方式遍历一组字符串的方法。该函数功能是遍历一组字符串,并且计算该字符串包含指定字符的个数,并且返回这个计算结果。具体代码如下所示:1.1函数定义如下/*定义*/unsigned int Widget::traverseString(const char *str, char ch){ /*遍历字符串str每一个成员,计算包含字符ch的个数*/ ...原创 2019-06-13 21:09:46 · 6885 阅读 · 0 评论 -
C++11新特性嵌套QVector初始化(智能指针auto用法)
在Qt c++中,数组一般用类QVector和QList替代,比如QVector<QPushbutton *> listBtn;或者QList<QPushbutton *>listBtn;。在纯C++中还有一个数组array可以替代传统数组,由于qt没有进一步封装该类,所以不讨论。下面将用一个例子展示模板类QVector和智能指针auto用法,如下代码所示:#inc...原创 2019-06-12 16:42:25 · 4062 阅读 · 1 评论 -
C/C++简单的日志函数总结(Qt Creator)
本文主要总结用C/C++写一个简单的日志函数,用的IDE是Qt Creator5.9.4。函数的功能是自动生成一个qlog.txt日志,当点击一次按钮,就自动添加一条日志信息,再次点击时,在qlog.txt文件末尾追加第二条日志信息,下面是具体的操作步骤。1.1新建一个QWidget工程,不要勾选ui界面,然后分别新建一个qlog.h和qlog.cpp的头文件和源文件(注意,不是类!),然后分...原创 2019-04-23 15:58:57 · 1308 阅读 · 0 评论 -
Linux下C++11的线程类用法(可连接线程和可分离线程thread)
Linux下调用多线程有两种方式,一种是利用POSIX线程库,一种是用C++11中的线程类,本文用的是后者。其中,Linux下用C++11创建多线程分为可连接的和不可连接的。可连接线程:需要调用thread成员函数thread::join()阻塞等待线程结束并且回收资源;thread默认创建的线程是可连接线程!不可连接线程(也就是分离线程):直接调用thread::detach()即可在线...原创 2019-02-27 22:34:33 · 2347 阅读 · 0 评论 -
MFC匿名管道原理详解、函数总结、调用实例(用MFC的匿名管道读取CMD输出内容)(C++语言)
本博客主要总结MFC中匿名管道的原理和具体调用实例,以及调用匿名管道三个核心函数各个参数用法详解,具体的如下所述。博主在做项目时,遇到一个问题。用程序调用一个进程,然后读取进程输出信息。但是,博主用Qt的QProcess无法读取标准输出,所以只能考虑管道技术。由于博主的开发环境是Windows10 64位,Qt的QProcess并没有找到类似的功能(可能博主对Qt研究不够深入,希望知道的大...原创 2018-10-18 20:23:31 · 2846 阅读 · 0 评论 -
利用CMD命令行杀进程方法(已知该进程的PID号,可以直接杀该进程)(QProcess、taskkill)
博主做工程时,利用Qt的主线程开启了一条支线程,然后用该支线程以阻塞的方式开启了一条进程。这条进程执行的时间很久,博主想要在执行到一半的时候,强行终止该进程。经过一天的资料查找,博主终于找打了一个简易可行的杀进程方法,下面详细的方法介绍如下。1.1博主利用Qt的QProcess在支线程里面开启了一条进程,并且获取了该进程的PID号。代码如下:(注意:在Qt下进程的PID是quint64 QPr...原创 2018-09-14 21:17:49 · 5611 阅读 · 0 评论 -
Qt5.9中单例模式用法(饿汉模式、懒汉模式,C++语言)
本文主要用Qt5.9的C++实现单例模式,分别有饿汉单例模式和懒汉单例模式。单例模式特点是拥有一个全局入口,能够实现唯一的实例对象。实现的核心思想是调用该类的静态成员函数,然后该静态成员函数返还一个指向该类的指针变量。具体的总结如下所述。一、饿汉单例模式(博主用的是这个)饿汉单例模式的优点是线程安全,可以用在多线程里面。缺点是在创建类时实例对象,浪费内存。具体的创建要点如下:(创建私有类实...原创 2018-09-05 16:36:21 · 2549 阅读 · 7 评论 -
bat批处理文件建立和打开
一、新建bat文件1.1新建文本文件,在文本文件写入如下内容:(注意不要有中文路径和中文名称)格式:start 目录路径\app.exe具体的实例如下所示:start D:\Qt\app.exestart D:\Qt\app1.exe上述两条脚本命令表示同时打开该目录下两个应用程序,不需要任何操作和等待。1.2选择文本文件另存为,保存类型选择所有文件,文件命名为app.bat。此时双击该app.b...原创 2018-02-26 10:10:05 · 3522 阅读 · 2 评论 -
一个基于C++的多线程编程实例(CreateThread函数)
本博客主要总结了基于C++的多线程函数CreateThread,互斥锁(或者称资源独占)函数CreateMutex,等待资源函数WaitForSingleObject,关闭线程函数(其实是关闭线程的句柄)CloseHanlde,释放互斥锁函数ReleaseMutex的用法实例,具体的程序用法和解释如下文所示:一、基于CreateThread函数的多线程程序1.1程序的功能是:主线程原创 2017-12-07 21:54:57 · 5394 阅读 · 2 评论 -
C++函数模板原理和用法总结(template auto decltype())
函数模板是C++一个重要特性,主要用在同一种相同或者相似结构中,但是函数的参数不同,下面是函数模板原理和用法总结。一、函数模板简单用法1.1简单模板函数定义template<typename T>void Swap(T &a, T &b){ T temp; temp=a; a=b; b=temp;}第一行支出要建立...原创 2019-06-18 21:48:20 · 1673 阅读 · 0 评论 -
C++中static用法之一(只在程序启动的时候初始化一次,后续不在初始化)(函数内调用同名外部变量用作用域解析运算符::)
C++中static定义静态变量时,只在程序启动的时候初始化一次,后续不在初始化,且定义的该变量只能在该文件中使用,而不能夸文件使用。要想在其它文件中使用全局变量,则需要在定义的文件中使用extern关键字进行定义,并且在使用的其它文件中,同样用extern关键字进行申明,然后才可以使用。当然,如果在同一个文件中,同名的局部变量和全局变量共存,则该函数内自动使用局部变量,想要使用全局变量,则要作用...原创 2019-06-19 20:21:21 · 3523 阅读 · 0 评论 -
C++友元函数基本用法(声明、定义、调用)
本文主要总结一个C++中基本的友元函数用法,包括友元函数声明和定义、一个应用简单例子和编译结果,友元函数特性总结,下面是具体讲述。1.1友元函数声明和定义首先友元函数是声明在类中的,作用是可以反问该类的私有成员(成员函数和成员参数)。其中,友元函数的声明跟平常函数声明基本一样,只需要在函数声明前加一个friend就行,友元函数的定义跟普通函数定义一模一样(不需要指定类作用域运算符),下面是...原创 2019-07-03 20:06:34 · 31584 阅读 · 1 评论 -
C语言定义外部全局函数基本模板(extern "C"、#ifdef __cplusplus)(C++)
C语言定义外部全局函数,只需要在定义当前函数的头文件,多加如下声明,就可以在外部文件调用该函数。#ifdef __cplusplusextern "C"{#endifint test();//定义全局函数#ifdef __cplusplus}#endif参考内容:https://github.com/mregmi/ext2read(参考:lvm.h头文件中...原创 2019-07-09 11:02:16 · 898 阅读 · 0 评论 -
C++中四种常用类型转换运算符基本用法1(dynamic_cast、const_cast、static_cast、reinterpret_cast)
C++中常用的类型转换运算符主要有四个,分别为:dynamic_cast、const_cast、static_cast、reinterpret_cast,主要目的是为了严格规范C语言的数据类型转换,不会像C语言一样松散(直接用小括号进行强制类型转,如int a=(int)Float)。下面将简单介绍各个类型转换运算符常用场景和基本实例。一、dynamic_cast类型转换运算符1.1 ...原创 2019-07-08 23:07:41 · 1059 阅读 · 0 评论