C++
C++知识点碎片整理
All In !!!
《活着》一书中的福贵,就是在生活的锤炼下,从悲痛中醒悟、在失去中成长,最终活得豁达从容。
展开
-
配置git详细步骤
准备工作:提前注册好github账号,记录清楚自己的账号和绑定的邮箱,下面步骤会用 https://github.com/正文开始:原创 2022-10-24 14:56:13 · 2656 阅读 · 1 评论 -
STL总结之<deque容器>
vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作。在介绍STL的deque的容器之前,我们先来总结一下vector和list的优缺点。vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操作符,节省空间。但是其在分配的内存不够的情况下,需要对容器整体进行重新分配、拷贝和释放等操作,而且在vector中间插入或删除元素效率很低。而list是以节点形原创 2021-04-28 14:52:58 · 320 阅读 · 0 评论 -
通过 emsdk 将 c 文件 编译为.js以及.wasm文件 【详细步骤】
大致描述:在C端将目标功能实现,然后编译为js以及wasm文件,web端来使用。【本文主要总结的是如何成功生成js和wasm文件】 前面的话:该文档主要参考如下几个链接:1、基于 ffmpeg + Webassembly 实现前端视频帧提取:https://blog.csdn.net/xgangzai/article/details/109192744 2、基于 ffmpeg+Webassembly 实现视频帧提取https://cloud.tencent.com/developer/art原创 2021-03-19 11:34:32 · 1804 阅读 · 7 评论 -
C++ 重载输入运算符 >>
这块知识盲区,补上,以便忘记时翻阅重载输入运算符 >>先了解两个小点:输入和输出运算符只能用友元函数重载。友元函数:指某些虽然不是类成员却能够访问类的所有成员的函数。上示例代码#include<iostream>using namespace std;class Student {public: Student(int math = 0, int english = 0, int total = 0) : _math(math), _english(en原创 2021-03-08 11:56:14 · 973 阅读 · 1 评论 -
C++截取字符串的末尾字符或字符串
我的另一篇关于字符串截取的博文:函数 substr 截取 string 中的一段示例题:截取字符串 “/n123/n456/n” 的末尾字符串 “/n”直接上干货 string str; str = "/n123/n456/n"; cout << "原字符串 : " << str.c_str() << endl; str = str.substr(0, str.length() - 2); // 核心 cout << "截取后的字符串原创 2021-03-05 14:37:26 · 13491 阅读 · 3 评论 -
C++中使用【事件】实现线程同步
事件(Event)是WIN32提供的最灵活的线程间同步方式,事件可以处于激发状态(signaled or true)或未激发状态(unsignal or false)。根据状态变迁方式的不同,事件可分为两类:1.手动设置:这种对象只可能用程序手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。2. 自动恢复:一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。使用”事件”机制应注意以下事项:(1)如果跨进程访问事件,必须对事件命名,在对事件命名的时原创 2021-03-04 10:30:31 · 726 阅读 · 4 评论 -
C++中使用【临界区】实现线程同步
临界区(Critical Section)是一段独占对某些共享资源访问的代码,在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。 临界区在使用时以 CRITICAL_SECTION 结构对象保护共享资源,并分别用 EnterCriticalSection() 和 LeaveCriticalSection原创 2021-03-04 09:51:17 · 704 阅读 · 2 评论 -
C++ 多线程 之 互斥锁mutex 的简单使用
示例描述: 通过两个线程将 公共值 i 从 0 加到 10先看一下没加锁的代码及输出:#include<iostream>#include<thread>using namespace std;int i = 0; // 公共数据// 线程1函数void aaa(){ for (int t = 0; t < 5; t++) { i++; cout << "线程1中 i = " << i << endl; }原创 2021-03-03 17:42:59 · 550 阅读 · 2 评论 -
C++简单的线程创建及使用
C++最简单的线程创建及使用头文件:#include<thread>关键步骤:thread mythread (线程函数, 参数1, 参数2…参数n);mythread.join();上实例代码#include<iostream>#include<thread>using namespace std;// 线程1函数void aaa(int a, int b){ cout << "111" << a <<原创 2021-03-03 16:55:43 · 697 阅读 · 3 评论 -
C++中 string 转为 char*
上代码: // string 转为 char* string str4 = "csdn"; const char *p = str4.data(); // 方法一 const char *t = str4.c_str(); // 方法二 结束: 分享也是自己对问题再次加深理解的方式,可能不全面,但绝对有用,后面将不断完善~...原创 2021-02-26 18:45:38 · 124 阅读 · 0 评论 -
C++中 char* 转为 string
上代码: // char * 转为string // 可直接转换 char str2[10] = {"CSDN"}; string str3 = str2; cout << str3.c_str() << endl; 结束: 分享也是自己对问题再次加深理解的方式,可能不全面,但绝对有用,后面将不断完善~...原创 2021-02-26 18:44:43 · 2419 阅读 · 0 评论 -
C++ 中 int 转为 string
上代码: // int 转 string int n = 10; char num[20] = {0}; itoa(n, num,10); // 将整型的n转为十进制的字符存储在num中 string str1 = num; // 将 char[] 直接转为string cout << str1.c_str() << endl; 结束: 分享也是自己对问题再次加深理解的方式,可能不全面,但绝对有用,后面将不断完善~...原创 2021-02-26 18:31:58 · 313 阅读 · 0 评论 -
C++中 string 转为 int
上代码: // string 转 int string str = "65"; int a = atoi(str.c_str()); cout << a << endl; 结束: 分享也是自己对问题再次加深理解的方式,可能不全面,但绝对有用,后面将不断完善~原创 2021-02-26 18:30:47 · 290 阅读 · 0 评论 -
今日报错系列 :“cout“ 不明确
解决办法:删掉 using namespace std; 保存后再重新写一遍即可。 结束: 分享也是自己对问题再次加深理解的方式,可能不全面,但绝对有用,后面将不断完善~原创 2021-02-26 18:24:10 · 688 阅读 · 0 评论 -
今日报错系列 :‘itoa‘: The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conforman
VS2017 C++ 在用到 itoa 时 遇到如下报错'itoa': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _itoa. See online help for details.经过研究查找后,是这样解决的:打开 项目属性 -> c/c++ -> 预处理器 -> 预处理器定义 -> 编辑输入如下两句:_CRT_NONSTDC原创 2021-02-26 18:10:34 · 3223 阅读 · 2 评论 -
C++思维导图汇总
结束: 分享也是自己对问题再次加深理解的方式,可能不全面,但绝对有用,后面将不断完善~原创 2021-02-24 17:46:04 · 5062 阅读 · 1 评论 -
设计模式 -- 简单工厂模式
简单工厂模式又叫静态工厂方法模式,是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式解决的问题是如何去实例化一个合适的对象。简单工厂模式的核心思想就是:有一个专门的类来负责创建实例的过程。简单工厂模式,把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。简单代码实现:#include <windows.h>#include <iostream>us原创 2021-02-24 16:50:31 · 157 阅读 · 2 评论 -
今日报错系列:在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加 “#include “stdafx.h“”?
不废话,上干货。解决方法:第一步:右键cpp文件,选择属性第二步:选择 预编译头第三步:预编译头设置为:不使用预编译头。第四步:应用 --> 确定 --> 重新编译即可。 结束: 分享也是自己对问题再次加深理解的方式,可能不全面,但绝对有用,后面将不断完善~...原创 2021-02-08 11:28:11 · 580 阅读 · 0 评论 -
浅谈可重入函数与不可重入函数
在实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果有一个函数不幸被设计成为这样:那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果。这样的函数是不安全的函数,也叫不可重入函数。 相反,肯定有一个安全的函数,这个安全的函数又叫可重入函数。那么什么是可重入函数呢?所谓可重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错。 一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的...转载 2021-01-27 10:15:04 · 101 阅读 · 4 评论 -
C++中 unordered_map 与 map 的区别
由于项目用到了,故抽空先大致记录一下unordered_map与map二者的区别下面 以 unordered_map ( 无序map ) 为主进行比较。1、头文件#include <unordered_map>#include 2、unordered_map 内部实现:哈希表 哈希表介绍【而 map 内部实现了红黑树】3、unordered_map 查找效率:非常高unordered_map 内部的Hash表通过把关键码值映射到Hash表中一个位置来访问记录,查找的原创 2021-01-21 18:00:08 · 1688 阅读 · 2 评论 -
今日报错系列:C++中string的rfind()函数的用法
今日小技巧巩固记录:rfind() 函数用法一句话总结:从后向前查找字符或者子字符串第一次出现的位置。find()函数是从前往后查找。举个栗子:rfind() string path = "012/456789/2021-01-18"; //待操作的字符串 int pos = path.rfind('/'); // rfind(),从后向前找到'/'第一次出现的位置 cout << "pos is :" << pos << endl; // 打印‘/’的位置原创 2021-01-18 16:23:54 · 2088 阅读 · 3 评论 -
今日报错系列:void * 类型的函数形参,该如何使用
今日在搞一个问题时,用到了void * 类型,在此记录一下问题大致描述:以void * 类型为参数的函数应该怎么使用void Problem(void* user_data);以下以传共享指针为例:代码很简单,耐心看完。 注意两点:下面代码的两个长注释#include <iostream>using namespace std;class StopMyDate {public: string aaa; string bbb; string ccc;};void原创 2021-01-12 18:02:53 · 1062 阅读 · 2 评论 -
shared_ptr 指针释放数组
我们都知道,智能指针可以自己释放内存,不用我们手动释放。但是智能指针的默认释放规则是不支持释放数组的,这时,需要我们再稍加操作,就可以完美释放,现总结两个解决方法:方法一:使用C++11提供的模板类 default_delete std::shared_ptr<int>ptr(new int[10],std::default_delete<int[]>());方法二:自定义释放规则std::shared_ptr<int>ptr(new int[10],myDe原创 2021-01-11 18:32:35 · 4181 阅读 · 0 评论 -
今日报错系列:函数 substr 截取 string 中的一段
今日字串截取的心得,分享一下。今日报错记录:分享一、截取string某个'子字串'之后至结束分享二、截取string变量的某一段分享三、补充 c_str()分享一、截取string某个’子字串’之后至结束示例如题:将字符串:“aaa bbb ccc , I love CSDN !” 中字符串 “ I ”之后的全部截取。【虽然示例这里字符串中只有 ‘I’ 一个字符,但道理不变】#include <iostream>using namespace std;int main(){原创 2021-01-04 11:34:20 · 867 阅读 · 4 评论 -
C++匿名函数Lambda使用
文章目录:1、匿名函数的使用2、什么是捕获列表?3、附加3.1、介绍Lambda3.2、Lambda捕获列表1、匿名函数的使用匿名函数的基本语法为://[捕获列表](参数列表)->返回类型{函数体}int main(){ auto Add = [](int a, int b)->int { return a + b; }; std::cout << Add(1, 2) << std::endl; return 0;}上述代码便会输出3,这就是匿转载 2020-12-09 09:44:46 · 321 阅读 · 0 评论 -
【个人纪录】C++面试总结之四(STL)
不严谨之处较多,欢迎指正,在学习的路上不断狂奔在C++的面试中,标准模板库(STL)的使用是绕不开的一个话题。这次就把关于STL的几个重要常用容器的区别及使用场景总结一下,以便后面查看。注:每个容器的使用细节这篇不过多描述,毕竟面试过程以表达为主,若想深入了解,可查看我的博客专栏【STL】,每个容器都单独进行了总结。正文开始: 一、项目中常用的容器:1、序列式容器:vector:向量容器【底层是内存可自动增长的数组】list:双向链表容器(底层是双向链表)deque:双端队列容器(底层是动原创 2020-12-04 14:59:24 · 269 阅读 · 0 评论 -
【个人纪录】C++面试总结之一(多态)
【个人纪录】C++面试总结之一(多态)由于本人是菜鸟级别,不严谨之处较多,欢迎大佬指正,在学习的路上不断狂奔比如面试官问了一个多态问题,然后就可以针对多态这个问题适当展开,不至于问你一个就回答这一个问题,无法完全展示自己技能,适当的展开可以为面试加分哟开始:多态分为静态多态、动态多态。静态多态,重载,就是在同一作用域内,函数名相同,参数不同,根据参数来确定调用。动态多态,重写,主要是虚函数,父类指针指向子类对象,接着再用指针调用被重写函数。一个类有虚函数,就有虚函数表,虚函数表里存放的就是每个虚函数原创 2020-09-29 09:56:52 · 217 阅读 · 0 评论 -
【个人纪录】C++面试总结之二(多线程)
【个人纪录】C++面试总结之二(多线程)由于本人是菜鸟级别,不严谨之处较多,欢迎大佬指正,在学习的路上不断狂奔比如面试官问了一个多线程问题,然后就可以针对多线程这个问题适当展开,不至于问你一个就回答这一个问题,无法完全展示自己技能,适当的展开可以为面试加分哟开始:什么是进程,什么是线程?进程:系统调度和分配的最小单元。线程:CPU调度和分配的最小单元。一个进程至少有一个线程,就是主线程。开发中使用多线程主要是为了提高产品的并发能力!提高运行效率!如何创建线程?C++11中引入了多线程技术,原创 2020-09-29 10:08:27 · 1446 阅读 · 4 评论 -
【个人纪录】C++面试总结之三(设计模式)
【个人纪录】C++面试总结之三(设计模式)由于本人是菜鸟级别,不严谨之处较多,欢迎大佬指正,在学习的路上不断狂奔比如面试官问了一个设计模式问题,然后就可以针对设计模式这个问题适当展开,不至于问你一个就回答这一个问题,无法完全展示自己技能,适当的展开可以为面试加分哟开始:C++中常用的设计模式有:单例模式、工厂模式、策略模式、适配器模式、原型模式、模板模式、建造者模式、外观模式、组合模式、代理模式、享元模式、桥接模式、装饰模式、备忘录模式、中介者模式、职责链模式、观察者模式等。简单描述一下工厂模式原创 2020-09-29 10:15:15 · 634 阅读 · 4 评论 -
STL总结之<list容器>
标准模板库:list容器 来,看黑板:链表是由一系列结点组成,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域。list容器不仅是一个双向链表,而且是一个循环的双向链表。List将元素按顺序储存在链表中. 与 向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢.若项目中需要进行频繁的插入删除数据,则可以优先考虑list。 常用函数:1、尾部添加元素:list.push_back();2、头部部添加元素:list.push_fron原创 2020-11-26 11:44:54 · 170 阅读 · 0 评论 -
STL总结之<vector容器>
标准模板库:vector容器 看黑板:vector,向量,封装了数组。内部实为一个指针指向一块连续的空间,当空间被放满时,会自动申请一块更大的空间,将原有的所有数据拷贝过来,并将上一块空间释放掉。由于是一块连续的空间,故可以用下标访问的方式进行随机访问。若项目中需要进行高频率的访问,则可以优先考虑vector。 常用函数:1、尾部添加元素:vector.push_back();2.尾部删除元素:vector.pop_back();3.两数据进行交换:vector.swap();4原创 2020-11-25 15:43:59 · 234 阅读 · 2 评论 -
Opencv之播放图片与视频
提前声明:该代码参考了其他大佬的精华实现了一把,站在巨人的肩膀上奔跑。。分享万岁<注:在配置好opencv的前提下,再进行下面的运行,若未配置好可在论坛上搜索,大把教学>若编译后,出现任何报错,可联系我,第一时间帮助解决。或者在我总结的报错博文里找找话不多说上代码播放图片:#include <opencv2/opencv.hpp>#include <iostream>using namespace cv;int main(){ Mat img = i原创 2020-11-13 16:45:11 · 367 阅读 · 0 评论 -
Opencv报错Assertion failed (size.width>0 && size.height>0) in imshow【多个解决方案】
绝对路径还是相对路径,都不行的话,就是imread读取图片出现问题,此时用方案二看一下是不是这个报错~解决方案一:相对路径改为绝对路径。温馨提示:一定要使用双斜杠\或者改为/反方向的斜杠,单斜杠是转义字符会导致读取的结果一直为空若不管是绝对路径还是相对路径,都不行,则可能是图片读取问题,我就是这个问题导致,就用到方案二解决方案二:配置“链接器->附加依赖项”时,若自己是Debug模式,则只保留“xxxd.lib”,若是Release模式则只保留“xxx.lib”二者留一个即可如下图:在属原创 2020-11-13 15:27:17 · 2965 阅读 · 7 评论 -
冒泡排序《附代码实现及动图表现》
什么是冒泡排序?是通过挨个的比较,将最大(或最小)数字层层交换至所有数据的开头,每冒一次,数据头部往后移一位,经过N次冒泡之后,得到最终排序!!!一图就搞明白了!~冒泡排序的复杂度: <空间复杂度为O(1)、时间复杂度为O(N^2)> 简单代码实现:(升序)#include <iostream>using namespace std;int main(){ int arr[10] = { 7,5,4,6,8,10,9,3,1,2 }; // 1-10的数值打乱放原创 2020-11-09 16:37:49 · 656 阅读 · 4 评论 -
QT实现贪吃蛇 --好家伙,直接上代码
好家伙,我直接好家伙,拿走直接运行~看下效果,再下拉看代码实现 ! ! !老规矩,直接上代码<双击空格开始,单击空格控制暂停与开始>.h写的啥#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QKeyEvent>#include <QRectF>#include <QPainter>#include <QPen>#include <QB原创 2020-11-06 16:35:56 · 4779 阅读 · 17 评论 -
C++全局变量的定义及如何使用
在项目中有时会用到全局变量来搞,比如一个变量在a文件和b文件中都要使用到extern能满足咱的需求上代码第一步(声明):在 a.h 中 #pragma once 下面这样加一句 extern int s;#pragma onceextern int s; // 加这个第二步(初始化):在 a.cpp 文件中 #include “a.h” 下面加 int s = 0;#include "a.h"int s = 0; // 加这个第三步(调用):在 b.cpp 中家入 a 的头文件 #in原创 2020-10-28 14:43:02 · 1653 阅读 · 0 评论 -
static关键字<很详细>
static关键字的作用C中static的作用修饰一:静态局部变量在修饰局部变量的时候,初始化局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。如果未对其初始化,系统会对默认初始化0或\0;修饰二:静态全局变量这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。其他文件中也可以定义和该变量一样的名字且不会冲突;修饰三:静...原创 2020-03-22 20:15:35 · 175 阅读 · 0 评论 -
浅析C++深浅拷贝
浅析C++深浅拷贝浅拷贝浅拷贝又称值拷贝,其实就是将原对象的值拷贝到目标对象中去,两者公用同一个实体,虽然名字不一样,但是用的地址是相同的。比如:有一个String类String a1;String a2(a1);将a1的值全部拷贝到a2中去(该操作为浅拷贝)。浅拷贝出现的问题,由于两者指向的是同一块内存,在程序结束时,先是调用a2析构函数,使得a2指向的内存得以释放,接着调用a1的...原创 2020-03-22 19:20:44 · 248 阅读 · 0 评论 -
TCP三次握手与四次挥手<详解>
TCP三次握手与四次挥手三次握手第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态(请求连接状态),等待服务器确认。第二次握手:服务器收到syn包,确认客户的SYN(ack=x+1),同时发送给客户端一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态(确认连接状态)。第三次握手:客户端收到服务器的SYN+ACK包,向...原创 2020-03-21 21:52:21 · 131 阅读 · 0 评论 -
C++为什么要虚析构函数<话术解析>
C++为什么要虚析构函数(简析)一个类如果有子类,那么该类的析构函数必须是虚函数,否则会出现释放不完全的情况,导致内存泄漏。如果父类的析构函数不是虚函数,那么在销毁对象时,只会调用父类析构函数,子类对象无法释放,导致内存泄漏;如果父类析构函数是虚函数,那么在释放的时候,首先调用子类析构函数,使得子类对象得以释放,接着进入父类析构函数,释放父类对象,这样子类父类都能够得以完全释放。这就是为什...原创 2020-03-20 19:47:48 · 349 阅读 · 0 评论