C++
文章平均质量分 73
入门系列
龙王.*?
向来心是看客心,奈何人是剧中人。
展开
-
C++ string总结
目录查找替换截断添加和删除字符串查找查找单个字符,参数str可以是字符串,里面的每个字符是或的意思,返回第一次出现字符的位置。find从pos(默认是是0,即从头开始查找)开始查找,找到第一个和str1相匹配的子串,返回该子串的起始索引位置;如果没有找到则返回-1。 size_t find (const string& str, size_t pos = 0)find_first_of说明:从pos(默认是是0,即从头开始查找)开始查找,找到第一个和str1相匹配的翻译 2021-08-16 15:00:42 · 382 阅读 · 0 评论 -
cuda编程(一)——VS2017搭建编程环境
目录步骤步骤新建空项目2. 右键项目,打开“生成依赖项”的“生成自定义”,选择CUDA10.0.配置属性页面右键项目,打开属性,进入包含目录,输入:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\includeC:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.0\common\inc打开库目录,输入:C:\ProgramData\NVIDIA Corpo原创 2021-07-21 21:30:46 · 1309 阅读 · 1 评论 -
VS2017制作和使用动态库
目录制作动态库使用动态库动态加载动态库方式制作动态库打开VS2017,新建静态库项目2. 项目内删除无关文件,再新建一个头文件mydll.h3. 示例代码// mydll.h#ifndef MYDLL#define MYDLL#ifndef DLL_API#define DLL_API _declspec(dllexport)#else#define DLL_API _declspec(dllimport)#endif // !DLL_API//声明导出的函数DL原创 2021-04-29 22:53:26 · 1178 阅读 · 2 评论 -
VS2017制作和使用静态库
目录制作静态库使用静态库制作静态库打开VS2017,新建静态库项目项目内删除无关文件,再新建一个头文件mylib.h示例代码// mylib.h#ifndef MYLIB#define MYLIBint myadd(int a, int b);int mysub(int a, int b);#else#endif // !MYLIB// mylib.cpp#include "mylib.h"int myadd(int a, int b) { return原创 2021-04-29 20:28:12 · 550 阅读 · 0 评论 -
C++——多线程(原子操作std::atomic)
目录引入背景利用互斥量解决利用原子操作解决原子操作优点和局限性引入背景下面的代码中,我们利用两个线程来对同一个变量count进行++操作。我们知道,当多个线程同时对共享数据进行读或写操作时,会发生一些难以预料的事,这里虽然不会出现异常,但最后的结果并不是我们想要的。理论上最后的结果为200000,但实际上是远小于这个值的。#include <iostream>#include <thread>using namespace std;void mythread(int翻译 2021-04-22 22:41:55 · 1343 阅读 · 0 评论 -
C++——多线程( async、future、shared_future、packaged_task、promise)
目录引入背景async、futurestd::asyncstd::future小例子std::packaged_taskstd::promise引入背景如果想实现在主线程中接收子线程的返回值,或者实现子线程之间的信息传递问题,这时候也许就会用到future对象。使用这个对象需要引入相关头文件。#include <future>我们会使用future对象来接收子线程的返回结果,并利用其成员函数get()来获取具体值。async、futurestd::asyncstd::a翻译 2021-04-22 15:34:12 · 409 阅读 · 0 评论 -
C++——多线程(condition_variable、wait、notify_one、notify_all)
目录引入背景condition_variable、wait、notify_one配合使用引入背景下述代码,如果容器有一段时间一直为空,我们需要一直循环判断容器是否为空,这样有些耗费资源。有没有一种方式,使得容器为空时,这条进程就先睡眠,等容器不为空时,系统再告诉我,然后睡醒继续干活。#include <iostream>#include <mutex>#include <thread>#include <vector>using names翻译 2021-04-21 18:25:59 · 842 阅读 · 1 评论 -
C++——多线程(单例模式及共享数据解决方式)
目录设计单例模式多线程下共享数据问题解决方式改进解决方式利用C++11新特性——std::call_once()设计单例模式作用:一个类只能实例化一个对象。#include <iostream>using namespace std;class singleClass {private: singleClass() {} //使得该类无法调用构造函数进行初始化 static singleClass *myinstance;public: static singleClas翻译 2021-04-21 15:32:49 · 1326 阅读 · 0 评论 -
C++——多线程(unique_lock(类模板))
目录unique_lock出现背景灵活性体现unique_lock所有权的传递unique_lock出现背景在绝大多数情况下,使用lock_guard已经够了,且其效率更高。之所以引出unique_lock,是因为它的灵活性更高,在某些复杂的场景下,也许会使用到它。下面使用unique_lock替代lock_guard。#include <iostream>#include <thread>#include <vector>#include <翻译 2021-04-21 11:53:05 · 302 阅读 · 0 评论 -
C++——多线程(互斥量概念及用法、死锁及解决方式)
目录引入互斥量背景互斥量(mutex)如何保证lock和unlock成对出现——lock_guard类模板死锁演示死锁解决死锁std::lock()函数模板std::lock_guard函数模板引入互斥量背景我们知道,线程之间是共享数据内存的,那么一块内存如果在同一时刻同时进行读取和修改,就会造成一个十分混乱的局面,到时系统崩溃。如下面一段代码:两个线程分别在共享数据vector容器内进行存取操作,一旦存取在同一个内存地址进行,就可能出现异常。#include <iostream>翻译 2021-04-20 19:39:59 · 782 阅读 · 0 评论 -
C++——多线程(传参注意事项)
目录传递临时对象查看线程id坑一坑二小注意点传递类对象、智能指针类对象智能指针传递成员函数指针传递临时对象查看线程idstd::this_thread::get_id();坑一这里的参数传递与一般情况下不同,常见的不管是值传递还是引用传递,他都在将参数对象复制拷贝一份给子线程。即参数传递前后的内存地址并不相同。#include <iostream>#include <thread>using namespace std;class Myclass {publ翻译 2021-04-20 14:16:32 · 973 阅读 · 0 评论 -
C++——多线程(认识并开启简单线程)
目录概念线程创建、启动、结束创建三种方式join()detach()思考代码概念可执行程序Windows以exe结尾的文件,Linux是拥有可执行权限x的文件。进程一个运行的可执行程序就叫一个进程。线程每个进程(执行起来的可执行程序),都有唯一的一个主线程。主线程随着进行开启,自动开启。除了主线程外,还可以在主线程中创建多条子线程,每创建一个新线程,就可以在同一时刻,多干一个不同的事。并发两个或者更多的任务(独立的活动)同时发生(进行)实现手段:1、翻译 2021-04-19 17:53:15 · 2367 阅读 · 0 评论 -
VS2017——无法打开程序数据库xxx\vc1401.pdb”;如果要将多个 CL.EXE 写入同一个 .PDB 文件,请使用/FS
目录问题解决附加问题:断点无效问题解决右击项目,点击属性,执行下面三步:“C/C++” --> "常规” -->”调试信息格式” 设置为 “C7 兼容(/Z7)”“C/C++” --> "代码生成” -->”启用字符串池” 设置为 “是(/GF)”“链接器” --> "调试” -->”生成调试信息” 设置为 “是(/DEBUG)”附加问题:断点无效Debug > Options > General > 将 “翻译 2021-04-19 15:40:42 · 3954 阅读 · 0 评论 -
C++STL——容器适配器(stack、queue、priority_queue)
目录介绍stackqueuepriority_queue介绍C++标准库中提供了三个容器适配器:stack(栈)、queue(队列)和priorityqueue(优先队列)。这三种容器适配器提供了简单易用的接口,满足了编程中的特殊数据处理需求。stackstack中的元素具有后进先出的特点。stack只能从一端插入、删除、读取元素,不允许一次插入或删除多个元素,且不支持迭代器操作。#include <iostream>#include <vector>#inc翻译 2021-04-17 18:55:48 · 251 阅读 · 0 评论 -
C++STL——序列容器(vector、deque、array、list、forward_list)
目录介绍vectordequearraylistforward_list介绍序列容器(Sequence Containers)也叫作顺序容器,序列容器各元素之间有顺序关系,每个元素都有固定位置,除非使用插入或删除操作改变这个元素的位置。特点可以在容器一端添加、删除元素序列容器有连续存储和链式存储两种存储方式顺序都是由程序设计者决定的vectorvector容器与动态数组相同,在插入或删除元素时能够自动调整自身大小,即vector容器能够自动处理存储数据所需的空间。特点翻译 2021-04-17 17:46:55 · 544 阅读 · 0 评论 -
C++STL——关联容器(set、multiset、map、multimap)
目录关联容器set、multisetpair类模板map、multimap关联容器序列容器中元素的顺序都是由程序设计者决定的,程序设计者可以随意指定新元素的插入位置,而关联容器的所有元素都是经过排序的,即关联容器都是有序的。它的每一个元素都有一个键(key),容器中的元素是按照键的取值升序排列的。关联容器内部实现为一个二叉树,在二叉树中,每个元素都有一个父节点和两个子节点,左子树的所有元素都比父节点小,右子树的所有元素都比父节点大。STL提供了四种关联容器,分别是set、multiset翻译 2021-04-17 12:56:23 · 202 阅读 · 0 评论 -
C++——IO流
目录简介ios类库streambuf类库标准I/O流——iostream预定义流对象cincout标准输出流put()write()标准输入流get()getline()read()ignore()gcount()peek()文件流文件流对象的创建文件打开和关闭文本文件的读写二进制文件的读写文件随机读写字符串流简介I/O流类库是C++标准库的重要组成部分,它主要包括ios类库和streambuf类库。其中,ios类库提供流的高级I/O操作,streambuf类库主要负责缓冲区的处理。ios类库翻译 2021-04-15 13:31:25 · 594 阅读 · 0 评论 -
C++ ——异常处理
目录try.....catch.......栈解旋标准异常静态断言try…catch…C++的异常处理通过throw关键字和try…catch语句结构实现。通常情况下,被调用的函数如果发生异常,就通过throw关键字抛出异常,而函数的上层调用者通过try…catch语句检测、捕获异常,并对异常进行处理。try{可能出现异常得代码块}catch(异常类型1){... //异常处理块}catch(异常类型2){... //异常处理块}catch(异常类型3){... //异常处理块翻译 2021-04-14 18:53:01 · 167 阅读 · 0 评论 -
QT——疑惑解答(一)
目录QT中文显示乱码无法打开源文件ui_xxx.h文件列表直接[]和at的区别QT中文显示乱码文件前加入下面这行代码#pragma execution_character_set("utf-8")无法打开源文件ui_xxx.h文件在VS中右击ui文件,点击编译,然后将生成的ui头文件放到项目的头文件目录下即可。列表直接[]和at的区别直接使用[]取值,源代码没有做检查,所以在运行后出现下标越界会直接报错。如果使用.at()方法,源代码做了检查,增加了开销,但出现下表越界时会原创 2020-11-24 19:10:50 · 241 阅读 · 0 评论 -
C++11——Lambda表达式
使用时机对于一些函数,我们创建时只会使用一次,为了避免造成资源的浪费,推荐使用匿名表达式来表示这个函数。一般形式[ ]( 参数表) ->返回值类型 { }其中,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略,->返回值类型可以省略不写。[]内用于定义函数对象参数,常见的=和&,前者表示参数按值传递,不可被修改,后者表示参数引用传递,其值可被修改。[=, &x, &y]表示外.翻译 2020-11-19 15:09:18 · 150 阅读 · 1 评论 -
C++——疑惑解答(一)
目录第一问:new与不new的区别第二问:解决信号和槽出现重载第三问:类的默认参数的构造函数属于无参构造函数?第四问:构造初始化列表的使用时机?第一问:new与不new的区别对象实例化前new与不new的区别?我们都知道对象的实例化一般有以下两种方式,两种都是调用默认的构造函数,应用上并无区别。类名 类实例化对象;类名 *类实例化对象 = new 类名();解答:前者在堆栈中分配内存,后者动态分配内存,后者可控性更强,但频繁的使用,容易造成空闲内存地址不连续,从而造成内存空间不足翻译 2020-11-19 13:57:53 · 301 阅读 · 0 评论 -
C++——对象的初始化和清理
构造函数和析构函数对象的初始化和清理是两个非常重要的安全问题,一个对象没有初始化状态,对其使用后果是未知的。同样使用完一个变量或对象,没有及时清理,也会造成一定的安全问题,如内存泄漏。C++利用构造函数和析构函数解决上述的问题,这两个函数在类的对象中会被编译器自动调用,完成对象初始化和清理工作。构造函数:主要用于在创建对象时为对象的成员属性赋值,默认的构造函数由编译器自动调用,且是空实现。析构函数:主要用于进行清理工作,工作于对象销毁前,,默认的析构函数由编译器自动调用,且是空实现。构翻译 2020-07-03 20:24:51 · 1037 阅读 · 0 评论 -
C++——引用
引用基本语法语法: 数据类型 &别名 = 原名引用本质:给一个变量起别名引用注意事项引用必须初始化类型 &别名; //错误的,没有初始化初始化后不可更改int a = 10,b=20;int &c = a;c = &b; //错误,引用初始化后,不可以改变其内存地址。引用做函数参数作用:函数传参时,可以利用引用的技术让形参装饰实参。优点:可以简化指针修改实参。我们都知道,函数的值传递不会使得实参改变形参,但地址传递可以。如下翻译 2020-06-26 00:04:06 · 156 阅读 · 0 评论 -
C++——内存分区
前言C++将内存方向划分为4个区域,代码区、全局区、栈区、堆区。每个区存放的数据,都赋予不同的生命周期,给予程序员更大的灵活编程。解释四区程序运行前在程序编译后,生成了exe可执行程序,在未执行该程序前内存分为下面两个区域。代码区:1、存放CPU指行的机器指令(就是我们写的代码,只不过被翻译成立0101);2、代码区是共享的,共享的目的是对于频繁被执行的程序,只需在内存中有一份代码即可;3、代码区是只读的,使其只读的原因是防止程序意外修改了他的指令;全局区:1、全局变量翻译 2020-06-20 20:37:27 · 214 阅读 · 0 评论 -
C++——面向对象程序设计(3)
类和对象类的定义1、 类的定义包括数据的定义和方法的定义。2、类中数据的定义不允许直接进行初始化;3、方法的定义可以通过类型 类名::方法名()放置类体外,但必须要在类内进行声明。数据成员访问除静态成员外,数据成员的访问需要通过对象来实现,类的定义并不会为其分配内存空间,只有实例化后才有内存空间的分配。1、public:公有成员,可被类内,子类,类外进行访问;2、protected:保护成员,可被类内,子类进行访问;3、private:私有成员,仅可被类内进行访问;使用翻译 2020-06-19 15:32:09 · 328 阅读 · 0 评论 -
C++练习题(2)
动态参数函数编写一个动态参数的函数,使函数能够适应不同的参数个数。思路:利用函数的省略参数,功能实现依赖于几个stdarg.h中定义的宏:1、 va_list:行为有点像数据类型,定义一个参数列表2、 va_start:行为有点像函数,参数为va_list类型的参数列表以及参数个数3、 va_arg:行为像函数,参数为va_list参数表以及参数数据类型,返回对应类型的参数值。4、 va_end:行为像函数,参数为va_list的参数表函数功能:接收不同个数和类型的参数,...翻译 2020-06-17 22:07:15 · 338 阅读 · 0 评论 -
C++文件查找——struct _finddata_t结构体
_finddata_t描述 struct _finddata_t { unsigned attrib; time_t time_create; time_t time_access; time_t time_write; _fsize_t size; char name[_MAX_FNAME]; };这个结构体是用翻译 2020-06-17 18:01:48 · 1736 阅读 · 0 评论 -
C++练习题(1)
不使用库函数,实现strcpy功能不使用库函数,复制源字符串到目标字符串中,即实现strcpy函数的功能。#include <iostream>using namespace std;char* my_strcpy(char* strdes, const char* strsrc){ if (NULL == strdes || NULL == strsrc) { throw "参数错误"; } char* temp = strdes; while ((*strdes+翻译 2020-06-16 14:04:42 · 458 阅读 · 0 评论 -
C++——面向过程程序设计(2)
函数通常一个应用程序主要由一个main函数和其他函数构成,主函数负责调用其他函数,其他函数可以调用调用自己或别的函数。如果函数不是void类型,一定要加return语句,且每一个函数参数都必须单独指定类型。一个函数调用的函数必须写在其前面,不然会报标识符没有声明的错误,解决方式可以通过前置声明函数,即:类型 函数名(参数);参数函数定义时的参数叫形参,调用时的参数叫实参。1、默认值参数形参里给参数设定默认值,这样实参可以省略这个参数的传递。需要注意一点的是,默认值参数必须放翻译 2020-06-15 22:06:42 · 325 阅读 · 0 评论 -
c++——语言基础(1)
文件结构C++程序主要包括两个文件,即头文件和源文件头文件头文件以.h为扩展名,主要包含版权与版本的声明、宏定义和函数、类信息的声明。头文件使用<>格式引用的是系统的头文件,编译器会到系统库文件目录下搜索,不会在当前工程下搜索。相反使用""格式引入的是自定义头文件,编译器首先在当前工程目录下搜索头文件,然后搜索系统库文件目录。源文件通常以.cpp为扩展名,主要包含源文件的版权与版本的声明、对头文件的引入、系统功能的实现代码。在开发应用程序时,通常将头文件和源文翻译 2020-06-14 21:45:37 · 349 阅读 · 0 评论