c++
文章平均质量分 55
kupeThinkPoem
这个作者很懒,什么都没留下…
展开
-
可以使用nullptr访问对象成员函数吗?
如果我们的对象指针没有没有指向真实的对象,而是被赋值为nullptr,使用它来访问成员函数会发生什么呢?如果你想知道,请继续看下文。我们可以看到,使用nullptr去访问成员函数,如果成员函数不是虚函数并且成员函数并没有访问类成员变量的时候,是可以访问成功的。如果非虚成员函数内部使用了成员变量,我们还是用nullptr去访问是会发生错误的,主要是因为没有对应成员变量在内存中存在。而如果成员函数是虚函数,为了得到虚函数就必须访问虚表,而nullptr是没有指向正确的虚表的,所以也就无法访问虚表,这也会导致。转载 2024-06-21 06:57:41 · 74 阅读 · 0 评论 -
C/C++ 数组负数下标
在某些特定情况下,程序员可能会故意使用负数下标来访问特定的数据结构(比如循环缓冲区),但这是需要精确控制并且完全了解内存布局的高级技巧。负数是可以被数组识别的,如果定义了一个数组int a[5],直接输出a[-2]的值,不同的编译器给出的是不同的值,肯定不是数组的值。在 C++ 中,数组是一块连续的内存空间,数组的下标通常用来定位这段内存中的特定元素。在上面的例子中,`arr[-1]` 实际上是尝试访问 `arr` 数组首地址之前的一个 `int` 类型大小的内存位置。// 未定义行为,不应该这么做。原创 2024-06-17 15:29:17 · 439 阅读 · 0 评论 -
#line指令
这条指令可以改变当前的行号和文件名,例如上面的这条预处理指令就可以改变当前的行号为30,文件名是a.h。初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译器的编写中,我们知道编译器对C 源码编译过程中会产生一些中间文件,通过这条指令,可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析。如果程序里面加了# line 100 "other_file" ,程序是不是就会执行other_file里面的100行代码,到底是不是这个意思?(程序不会执行other_file里面的100行代码)。原创 2024-06-17 14:42:35 · 441 阅读 · 0 评论 -
va_start和va_end使用介绍
那么,调用函数的时候,实参 char z 先进栈,然后是 float y,最后是 int x,因此在内存中变量的存放次序是 x->y->z,因此,从理论上说,我们只要探测到任意一个变量的地址,并且知道其他变量的类型,通过指针移位运算,则总可以顺藤摸瓜找到其他的输入变量。(3)若想获取参数,调用va_arg,它的第一个参数是ap,第二个参数是要获取参数的类型,然后返回此类型的值,这两个类型必须一致,并把 ap 的位置指向"变参表"的下一个变量位置;函数参数是以数据结构栈的形式存取,从右至左入栈。原创 2024-06-06 09:29:54 · 425 阅读 · 1 评论 -
C++查看数据类型
std::cout << "num 的数据类型是:" << typeid(num).name() << std::endl;std::cout << "str 的数据类型是:" << typeid(str).name() << std::endl;std::cout << "pi 的数据类型是:" << typeid(pi).name() << std::endl;使用`typeid`运算符需要包含头文件`<typeinfo>`。在C++中,可以使用`typeid`运算符来查看数据类型。原创 2023-07-13 17:11:45 · 2764 阅读 · 0 评论 -
Stl map的高效删除
这种删除方式也是STL源码一书中推荐的方式,分析 mapStudent.erase(iter++)语句,map中在删除iter的时候,先将iter做缓存,然后执行iter++使之指向下一个结点,再进入erase函数体中执行删除操作,删除时使用的iter就是缓存下来的iter(也就是当前iter(做了加操作之后的iter)所指向结点的上一个结点)。需要注意的是,使用erase()函数删除元素时,要避免在循环中使用迭代器进行删除操作,因为这会导致迭代器失效,从而引发未定义的行为。1. 通过迭代器删除。原创 2023-05-19 11:42:39 · 3590 阅读 · 0 评论 -
模板函数与特化函数实现高效dynamicCast
目录一、概述二、模板函数三、模板特化1、全特化2、局部特化四、dynamicCast的模板实现五、参考 模板是一种参数化的多态工具 所谓参数化的多态性,是指将程序所处理 的对象的类型参数化,使一段程序代码可以用于处理多不同类型的对象。 采用模板编程,可以为各种逻辑功能相同而数据类型不同的程序提供一种代码共享的机制。模板包括函数模板(function template)、类模板(class template)。本文主要讨论函数模板 函数模板为所有的函数提供唯一的一段函数代码,增强了原创 2022-06-28 06:28:46 · 276 阅读 · 1 评论 -
无法链接_sqlite3_unlock_notify函数问题的解决
目录一、问题二、解决方案三、sqlite3_unlock_notify与_sqlite3_unlock_notify1、__cdecl2、_cdecl、_stdcall、__fastcall三者之间的区别四、查看sqlite3.lib和sqlite3.dll1、sqlite3.lib2、sqlite3.dll一、问题编译odb的libodb-sqlite-2.4.0时,出现了无法链接_sqlite3_unlock_notify函数的问题。二、解决方案输入原创 2022-03-25 23:15:28 · 628 阅读 · 0 评论 -
函数在lib和dll中的命名规则
这两天研究Dll和Lib的创建和使用看到一篇文章很不错.下面是摘录一部分修饰名(Decoration name) “C”或者“C++”函数在内部(编译和链接)通过修饰名识别。修饰名是编译器在编译函数定义或者原 型时生成的字符串。有些情况下使用函数的修饰名是必要的,如在 模块定义文件里头指定输出“C++”重载函数、构造函数、析构函数,又如在汇编代码里调用“C””或“C++”函数等。 修饰名由函数名、类名、调用约定、返回类型、参数等共同决定。 2、名字修饰约定随调用约定和编译种类(C或C+转载 2022-03-24 20:40:28 · 506 阅读 · 0 评论 -
c++ main中argc和argv解析
argc 是 argument count的缩写,表示传入main函数的参数个数;argv 是 argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0]一定是程序的名称,并且包含了程序所在的完整路径,所以确切的说需要我们输入的main函数的参数个数应该是argc-1个;简单用法示例,新建工程键代码:#include <iostream>using namespace std;void main(int argc,char *..原创 2022-03-24 13:34:46 · 1371 阅读 · 0 评论 -
基于RapidJson的c++类的序列化和反序列化
目录一、rapidjson简介二、序列化思路三、C++实体类的的序列化和反序列化1、RapidjsonHelper帮助类2、实体类的的序列化和反序列化 3、main函数四、下载一、rapidjson简介RapidJSON 是一个 C++ 的 JSON 解析器及生成器。它的灵感来自RapidXml。RapidJSON 小而全。它同时支持 SAX 和 DOM 风格的 API。SAX 解析器只有约 500 行代码。 RapidJSON 快。它的性...原创 2022-03-10 19:59:32 · 2822 阅读 · 0 评论 -
c++中std::map简介及find用法
目录一、map简介 二、map的功能1、快速插入Key-Value记录。2、快速删除记录3、根据Key修改value记录。4、遍历所有记录。三、使用map四、map的构造函数五、map的find用法一、map简介 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,...原创 2021-11-29 23:09:32 · 39432 阅读 · 1 评论 -
C++ static用法总结
要理解static关键字在C++中的所有作用,首先要明白程序所使用的不同内存区域的作用。C++程序运行时使用三种内存,一种是static内存,还有一种是stack内存,以及heap内存(动态内存池)。转载 2021-11-13 21:25:20 · 2502 阅读 · 0 评论 -
C++单例模式实现及解析
单例模式是一种常见的软件设计模式。它的核心结构只包含一个被称为单例的特殊类。它的目的是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。原创 2021-11-07 11:45:57 · 1170 阅读 · 0 评论 -
Memory Reordering Caught in the Act
When writing lock-free code in C or C++, one must often take special care to enforce correct memory ordering. Otherwise, surprising things can happen.Intel lists several such surprises in Volume 3, §8.2.3 of theirx86/64 Architecture Specification. Here’.转载 2021-10-19 19:47:19 · 146 阅读 · 0 评论 -
GNU C++ 智能指针3-- 解析_Sp_counted_base类
目录一、关键点解析1、_Lock_policy解析2、__default_lock_policy的定义3、__atomic_add_dispatch解析4、__attribute__5、__exchange_and_add_dispatch解析6、_GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE和_GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER解析7、_GLIBCXX_READ_MEM_BARRIER和_GLI..原创 2021-08-22 10:08:13 · 1635 阅读 · 1 评论 -
GNU C++ 智能指针2-- 解析_Mutex_base类
目录一、关键点解析1、_S_mutex解析2、_Mutex_base的父类二、代码解析一、关键点解析1、_S_mutex解析 enum _Lock_policy { _S_single, _S_mutex, _S_atomic };可以看出_S_mutex是个enum值,值为12、_Mutex_base的父类是继承__mutex 类的(__mutex 类解析可以参考https://blog.csdn.net/kupepoem/article/details/1..原创 2021-08-22 06:52:48 · 333 阅读 · 0 评论 -
GNU C++ 智能指针1-- 解析__mutex 类
目录一、关键问题解析1、__GTHREAD_MUTEX_INIT的解析2、__gthread_active_p的解析3、__gthread_mutex_t二、代码解析一、关键问题解析1、__GTHREAD_MUTEX_INIT的解析gthr-default.h文件中定义#define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZERPTHREAD_MUTEX_INITIALIZER则是一个结构常量2、__gth.原创 2021-08-21 18:30:44 · 681 阅读 · 0 评论 -
深度优先搜索非递归方式
目录一、概述二、深度优先搜索非递归三、代码一、概述 深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。深度优先遍历图的方法是,从图中某顶点v出发:(1)访问顶点v;(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优...原创 2021-05-16 10:36:55 · 1233 阅读 · 0 评论 -
图的创建及拓扑排序
目录一、图二、拓扑排序三、代码四、测试一、图1 图的概念1.1 图的基础概念串讲图的结构很简单,就是由顶点 V VV 集和边 E EE 集构成,因此图可以表示成 G = ( V , E ) G=(V, E)G=(V,E) 。 图1-1:无向图1图1-1就是无向图,我们可以说这张图中,有点集 V = { 1 , 2 , 3 , 4 } ,边集E = { ( 1 , 2 ) , ( 1 , 4 ) , ( ...原创 2021-05-08 21:34:06 · 224 阅读 · 0 评论 -
完全背包问题优化
目录一、题目描述二、总体思路三、优化思路四、代码一、题目描述有4种物品,它们有各自的体积和价值,现有给定容量的背包不限定各个种类物品的数量,如何让背包里装入的物品具有最大的价值总和?为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capacity=8二、总体思路01背包问题是最基本的背包问题,我们可以考虑把完全背包问题转化为01背包问题来解。最简单的想法是,考虑到第i种物品最多选m/w[i]件,于是可以把第i种物品转化为m/...原创 2021-05-02 10:37:15 · 157 阅读 · 0 评论 -
完全背包问题
目录一、题目描述二、总体思路三、代码一、题目描述有4种物品,它们有各自的体积和价值,现有给定容量的背包不限定各个种类物品的数量,如何让背包里装入的物品具有最大的价值总和?为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capacity=8二、总体思路01背包问题是最基本的背包问题,我们可以考虑把完全背包问题转化为01背包问题来解。最简单的想法是,考虑到第i种物品最多选m/w[i]件,于是可以把第i种物品转化为m/w[i]件费用及...原创 2021-05-02 10:34:23 · 138 阅读 · 0 评论 -
01背包问题优化
目录一、题目描述二、总体思路三、优化思路四、代码一、题目描述有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capacity=8二、总体思路根据动态规划原理首先要找出状态转移方程。 i,前i件物品 j,背包容量 w[i],第i件物品重量 v[i],第i件物品价值 f[...原创 2021-05-02 10:27:11 · 283 阅读 · 0 评论 -
最短路径迪杰斯特拉算法--邻接矩阵
一、算法介绍迪杰斯特拉算法(解决单源最短路径)基本思想:每次找到离源点(如1号节点)最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。基本步骤:1,设置标记数组book[]:将所有的顶点分为两部分,已知最短路径的顶点集合P和未知最短路径的顶点集合Q,很显然最开始集合P只有源点一个顶点。book[i]为1表示在集合P中;2,设置最短路径数组dst[]并不断更新:初始状态下,dst[i]=edge[s][i](s为源点,edge为邻接矩阵),很显然此时dst[s]=原创 2021-04-23 21:45:59 · 1239 阅读 · 0 评论 -
最短路径迪杰斯特拉算法--邻接链表
一、算法介绍迪杰斯特拉算法(解决单源最短路径)基本思想:每次找到离源点(如1号节点)最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。基本步骤:1,设置标记数组book[]:将所有的顶点分为两部分,已知最短路径的顶点集合P和未知最短路径的顶点集合Q,很显然最开始集合P只有源点一个顶点。book[i]为1表示在集合P中;2,设置最短路径数组dst[]并不断更新:初始状态下,dst[i]=edge[s][i](s为源点,edge为邻接矩阵),很显然此时dst[s]=原创 2021-04-23 21:44:01 · 1253 阅读 · 0 评论 -
01背包问题
一、题目描述有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capacity=8二、总体思路根据动态规划原理首先要找出状态转移方程。 i,前i件物品 j,背包容量 w[i],第i件物品重量 v[i],第i件物品价值 f[i][j],用j的容量去装前i件物品的最大价值 j&g...原创 2021-04-18 10:10:39 · 54 阅读 · 0 评论 -
栈的应用-出栈序列
一 、题目题目描述给定一个由n个元素构成的序列,你需要将其中的元素按顺序压入一个大小为c的栈并弹出。元素按它们的出栈顺序进行排列,会得到一个新的序列。我们知道,这样的序列会有很多种,请输出所有新序列中第一个元素最小的序列(若第一个元素最小的序列有多个,则令第二个尽可能小;若仍有多个,则令第三个最小,以此类推)。输入格式第一行,两个数n,c第二行n个数,为序列中n个元素的值输出格式输出n个数,为满足要求的序列。输入输出样例输入 #1 复制6 45 2 3 8 7 4输出 #1原创 2021-04-10 10:37:00 · 1361 阅读 · 0 评论 -
栈应用-简化路径
目录一、题目二、思路三、源码一、题目以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…)表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linu.原创 2021-03-21 10:25:42 · 119 阅读 · 0 评论 -
回溯法应用三-爬梯子问题
一、问题假设你现在正在爬楼梯,楼梯有n级。每次你只能爬1级或者2级,那么你有多少种方法爬到楼梯的顶部以及具体爬梯步骤?本题采用回溯法解,当然还有动态规划、斐波那契数列等求解方法。二、源码#include <iostream>using namespace std;int num[100];int digit,rest,total;void print(int d){ total+=1; for(int i=1;i<=d-1;i++) { co.原创 2021-03-20 11:14:04 · 456 阅读 · 0 评论 -
回溯法应用二实现整数n的拆分成k份
一、问题将正整数n拆分成k个不能整数的和,0<k<=n,求有多少种差分方法。比如:将7差分成3个不同整数的拆分法有8中,其中1,1,5和1,5,1属于同一种拆分法。该问题等同于:将n个完全相同的物品放到k个完全相同的容器中,求有多少种方法。二、源码#include <iostream>using namespace std;int num[100];int digit,rest,total;int k;void print(int d){ to原创 2021-03-20 11:01:55 · 676 阅读 · 0 评论 -
回溯法应用一实现整数n的拆分
目录一、问题将一个正整数拆分成若干个正整数的和。二、源码一、问题将一个正整数拆分成若干个正整数的和。输入格式:一个正整数n输出格式:若干行,每行一个等式(每个数或者等号间都有一个空格,第一个数前没有空格,最后一个数后面没有空格,数与数之间要求非降序排列)。最后一行给出解的总个数输入样例:在这里给出一组输入。例如:6输出样例:在这里给出相应的输出。例如:6 = 1+1 +1+ 1+ 1 +16 = 1+ 1+ 1+ 1+ 26 = 1+ 1+ 1+ 36.原创 2021-03-20 10:52:09 · 392 阅读 · 0 评论 -
栈模拟队列
目录一、实现思路二、代码三、模拟队列的使用一、实现思路(1) 使用两个栈sa,sb,其中假定sa负责push操作,sb负责pop操作。(2)实现队列的push操作,每次进行添加操作,都会相应得对栈sa进行添加元素。(3) 实现队列的pop操作,每次进行删除操作,因为栈sb负责pop操作二、代码#include<iostream>#include<stack>using namespace std;template<class T..原创 2021-03-14 10:16:18 · 107 阅读 · 0 评论 -
用栈实现计算后缀表达式(0-9数值运算示例)
一、原理可以先建立一个栈S 。从左到右读表达式,如果读到操作数就将它压入栈S中,如果读到n元运算符(即需要参数个数为n的运算符)则取出由栈顶向下的n项按操作符运算,再将运算的结果代替原栈顶的n项,压入栈S中 。如果后缀表达式未读完,则重复上面过程,最后输出栈顶的数值则为结束。二、代码int calculate(string s){ int temp1,temp2,temp3; int len=s.length(); stack<int> st; for(int i=0;i原创 2021-03-07 10:11:18 · 438 阅读 · 0 评论 -
用栈实现中缀表达式转后缀表达式(0-9数值运算示例)
中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈(“*/”的优先级比“+-”高)6.最终将栈中的元素依次出栈,输出。#include<iostream>#include<stack>using nam原创 2021-02-28 10:33:52 · 300 阅读 · 0 评论 -
freeglut编译及使用
参考:https://blog.csdn.net/qq_41598072/article/details/81543428https://blog.csdn.net/linian71/article/details/68485494目录一、freeglut介绍二、freeglut下载及编译1、下载2、用CMake编译生成freeglut.sln3、编译freeglut.sln三、freeglut使用一、freeglut介绍先介绍下Glut库。GLUT最初...原创 2020-08-29 16:06:27 · 2051 阅读 · 0 评论 -
轻松学习设计模式1
最近重看设计模式感触良多,做软件还是需要多看设计模式的,好处多多。设计模式六大原则1.开闭原则(Open Close Principle)开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。2.里氏代换原则(Liskov Substitution Principle)里氏代换原则(Liskov Substitution Princip原创 2020-08-29 11:46:09 · 217 阅读 · 0 评论 -
vs2015下pthread的使用
参考:https://blog.csdn.net/k459905889/article/details/48676159https://zhuanlan.zhihu.com/p/77551877目录一、pthread介绍二、下载三、配置1、解压后共有三个文件夹2、打开Pre-built.23、配置头文件及静态链接库4、配置动态链接库四、使用一、pthread介绍 POSIX线程(英语:POSIX Threads,常被缩写为Pthreads)是P...原创 2020-08-24 12:15:54 · 747 阅读 · 0 评论 -
pthread c++线程池实现
pthread下载:pthreads-w32-2-9-1tp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zippthread vs2015配置请参考https://blog.csdn.net/k459905889/article/details/48676159转自: https://zhuanlan.zhihu.com/p/77551877 在定时器模块的文章中我们知道,如果在定时器很...转载 2020-08-21 16:31:39 · 739 阅读 · 0 评论 -
动态规划实战-最长公共子序列
参考:https://blog.csdn.net/wwlcsdn000/article/details/78600167?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task大家可以先看看前一篇文章动态规划实战,上篇文章分析了动态规划问题求解的三种方...原创 2020-03-06 11:41:49 · 485 阅读 · 0 评论 -
动态规划实例解析
参考:https://www.zhihu.com/question/39948290https://baijiahao.baidu.com/s?id=1635388976060265522&wfr=spider&for=pc乔治·桑塔亚纳说过,“那些遗忘过去的人注定要重蹈覆辙。”这句话放在问题求解过程中也同样适用。不懂动态规划的人会在解决过的问题上再次浪费时间,懂的人则会事...原创 2020-03-04 16:47:03 · 345 阅读 · 0 评论