C/C++
文章平均质量分 71
凉冰难消一腔热血
在读通信专业的研究生一枚
展开
-
C++ 之 constexpr和常量表达式
常量表达式(constexpression)是指不会改变并且在编译过程就能得到计算结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。后面将会提到,C++语言中有几种情况下是要用到常量表达式的。尽管staff_size的初始值是一个字面值常量,但由于它的数据类型只是一个普通int而非constint,所以它不属于常量表达式。另一方面,尽管sz本身是一个常量,但它的具体值知道运行时才能获取到,所以也不是常量表达式。......原创 2022-07-26 22:23:34 · 546 阅读 · 0 评论 -
C++ - explicit关键字
C++中关于explicit关键字的详解原创 2022-07-25 22:13:14 · 2111 阅读 · 0 评论 -
C/C++中在子函数中使用malloc分配内存和free释放内存的方法
1. 子函数malloc分配内存为了增强程序可读性,有时会在子函数中malloc分配内存。测试了如下三种方法,容易想到的是第一种。事实证明这种也是错误的!#include <stdio.h>#include <string.h>#include <stdlib.h> typedef struct _dataStc{ int buf[100]; int size;}dataStc; void func1(dataStc* p){ p = (dat原创 2021-07-20 21:55:22 · 4531 阅读 · 1 评论 -
二叉树的迭代遍历-2
二叉树的递归遍历二叉树的递归遍历方法较为简单,我在之前的博客中已经介绍过:<二叉树的递归遍历>递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,因此递归可以返回上一层。二叉树的迭代遍历:二叉树也可以使用栈来实现迭代遍历,具体代码如下所示前序遍历是中左右,每次先处理的是中间节点,因此需要先将根节点放入栈中,然后将右子节点入栈,最后使左子节点入栈。因此前序遍历的代码最为简单但是如果使用上面的前序遍历原创 2021-05-21 09:23:07 · 89 阅读 · 0 评论 -
Linux中的stat函数只能访问当前用户所在目录(提示stat-No such file or directory错误)
问题介绍最近使用Linux C进行编程的时候,当递归读取目录的时候会发现stat函数一直再报错(No such file or directory),经过一晚上的修改bug,发现我的代码中的stat函数只能访问用户当前所在的路径下的文件(即’pwd‘命令所提示的目录)。例如:此时我所在的路径为:/home/mrzhi/Desktop/Linux-网络编程/Unix_systems_programming/Chapter5_File_system结果:可以发现该代码可以正确访问所在路径下的文件,但是原创 2021-05-20 09:20:43 · 5995 阅读 · 0 评论 -
动态规划1-动态规划分析
一:动态规划算法介绍:1.动态规划(dynamic programming)与分治方法相似,都是通过组合子问题的解来求解源问题。而分治方法将问题划分为互不相交的子问题,递归地求解子问题,再将它们的解组合起来,求出原问题的解。与之相反,**动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题子问题的求解是递归进行的,将其划分为更小的子子问题)**。在这种情况下,分治算法会做许多不必要的工作,它会反复地求解那些公共子子问题。而动态规划算法对每个子子问题只求解一次,将其解保存在一个表格中,原创 2021-04-24 11:34:55 · 286 阅读 · 0 评论 -
C++---深拷贝和浅拷贝
C++中的深拷贝和浅拷贝这里使用c++中类的拷贝和幅值进行介绍:深拷贝和浅拷贝的区别:** 1. 浅拷贝就是系统默认提供的拷贝** 2. 深拷贝就是重新在 堆区 开辟内存空间** 3. 浅拷贝带来的问题就是: 内存重复释放** 4. 浅拷贝的问题,要利用深拷贝来解决代码示例:#include <iostream>#include <string> using namespace std;class Person{public: Person(){原创 2021-04-02 13:54:10 · 115 阅读 · 0 评论 -
C++ --- 普通函数与函数模板的区别
普通函数与函数模板的区别普通函数调用时可以发生自动类型转换(隐式类型转换)函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换如果利用显示指定类型的方式,可以发生隐士类型转换代码示例:#include <iostream>#include <vector>using namespace std;// 1.普通函数会自动进行隐式转换 int test01(int a, char c){ return a+c;}// 2.函数模板(不可以进行类型转原创 2021-04-01 21:00:49 · 77 阅读 · 0 评论 -
并查集
在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。有一个联合-查找算法(Union-find Algorithm)定义了两个用于此数据结构的操作:Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。Union:将两个子集合并成同一个集合。由于支持这两种操作,一个不相交集也常被称为联合-查找数据结构(Union-find Data Structure)或合并-查找集合(Merge-find Set)。为了更加精确的.原创 2021-03-13 13:39:19 · 751 阅读 · 0 评论 -
三十六进制加法(0-9,a-z)
三十六进制加法:由数字 + 小写字母组成,此时每个数字用字符串表示。0-9 表示 0-9, a-z 表示 10-35如”1a“ + "2b" = "3c", "3"+"a"=”d"这里可以使用字符串直接进行求和注:不可以转换为整数,如果转换为整数,可能会导致内存溢出,且会占用大量内存。class Solution{public: /*判断每个字符属于0-9还是a-z*/ char getChar(int n){ if(n <= 9) return n+...原创 2021-03-13 09:25:19 · 3218 阅读 · 0 评论 -
LeetCode中问题:reference binding to null pointer of type ‘const value_type‘
一、问题描述在刷LeetCode 中剑指Offer04的二维数组中的查找时,执行代码结果正确,但提交结果出现:Line 1003: Char 34: runtime error: reference binding to null pointer of type 'struct value_type' (stl_vector.h)的报错。二、问题排查通过查看最后执行的输入为[]或为[[]]时,查看代码发现当输入为空的时候没有进行相应的操作。...原创 2021-02-19 14:28:01 · 670 阅读 · 0 评论 -
exit和return的区别
1、exit();是整个程序的结束。exit(0):正常运行程序并退出程序; exit(1):非正常运行导致退出程序;2、return(); 是某个函数的结束,并返回结果。return返回函数值,是关键字; exit 是一个函数。 return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。 return是函数的退出(返回);exit是进程的退出。 return是C语言提供的,exit是操作系统提供的(或者函数库中给出...原创 2020-10-20 16:32:32 · 2870 阅读 · 0 评论 -
C++中STL---accumulate累积函数
accumulate: 功能描述:计算区间内 容器元素累计总和 算法简介:accumulate(iterator beg, iterator end, value); //计算容器元素累计总和 //[b...原创 2020-10-04 19:14:39 · 2669 阅读 · 3 评论 -
c++中 string 和 int 类型转换
在C++编程的时候,有时需要将string类型转为int类型,则需要进行2部分:1、首先将 字符串string 转为 C语言中的 const char* 类型(使用 _c.str()函数)2、将 const char* 转为 int 类型(使用atoi(const char *)函数)注意:.c_str()函数在#include<string>的头文件中 atoi()函数在#include<stdlib.h>的头文件中,如果使用,则必须包含该头文...原创 2020-09-17 21:31:05 · 15964 阅读 · 1 评论 -
数组指针和指针数组的区别
数组指针和指针数组的区别数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]p++;...转载 2020-08-20 11:31:38 · 133 阅读 · 0 评论 -
在Windows命令行中编译运行C/C++程序
此处运行环境是在Windos下,运行cmd命令进入DOS界面首先,如果想在DOS窗口中进行C/C++代码的编译,则需要先配置gcc的环境变量。1、使用g++进行编译链接为了可以方便观察,这里我使用一份Helloworld代码(HelloWorld.cpp)#include <iostream>using namespace std;int main(){ cout << "HelloWorld!" << endl; syste..原创 2020-08-15 11:04:29 · 36323 阅读 · 2 评论 -
public/private/protected的区别
第一部分:定义和声明要继承使用的话要用protected声明。 (子孙类也可以用)。1、public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用2、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用。3、protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class, protected就变成private。第二部分...原创 2020-08-12 21:31:07 · 1103 阅读 · 0 评论 -
C++中const修饰符讲解(2)
今天在使用const编程时发现以下报错,说我未初始化变量。后来查阅相关资料,发现这个博主的介绍还可以,因此写下来提醒自己,方便以后的学习。博主链接:https://blog.csdn.net/gaotong2055/article/details/8139007•const:常量限定修饰符,它把一个对象转换为常量(constant)。const对象必须初始化而且是在定义的同时。初始化后的const对象(或指针)是不能修改的。例1: int i = 0; const i转载 2020-08-09 10:23:46 · 396 阅读 · 0 评论 -
forbids in-class initialization of non-const static member不能在类内初始化非const static成员
今天在进行C++编程时,发现了一些小错误,里面的报错为:编译器提示我不能在类内初始化非const static成员变量,经过查阅相关书籍和资料后得到的原因为:C++标准只允许static constant intergral或者枚举类型的数据在类内进行初始化。引用:C++03 9.4.2 Static data members§4If a static data member is of const integral or const enumeration type, its de.原创 2020-08-07 22:07:57 · 1906 阅读 · 2 评论 -
C++内存分区模型
内存分区模型:C++ 程序在执行时,将内存大方向划分为4个区域代码区:存放函数体的二进制代码,由操作系统进行管理全局区:存放全局变量和静态变量以及常量栈 区:由编译器自动分配释放,存放函数的参数值、局部变量等堆 区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收内存四区的意义:不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程。1.1 程序运行前: 在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域 代码区:...原创 2020-08-04 17:20:36 · 137 阅读 · 0 评论 -
const关键字
// const修饰指针有三种情况: // 1、const修饰指针 --常量指针 特点:指针的指向可以修改,但是指针指向的值不可以改 // 2、const修饰常量 --指针常量 特点:指针的指向不可以修改,但是指针指向的值可以该 // 3、const即修饰指针,有修饰常量 特点:指针的指向和指针指向的值都不可以改#include <iostream>using namespace std;int main(){ // cons...原创 2020-07-28 20:30:23 · 88 阅读 · 0 评论 -
C++中随机数的生成
1.随机数由生成器和分布器结合产生生成器generator:能够产生离散的等可能分布数值分布器distributions: 能够把generator产生的均匀分布值映射到其他常见分布,如均匀分布uniform,正态分布normal,二项分布binomial,泊松分布poisson2.分布器利用运算符()产生随机数,要传入一个generator对象作为参数1 std::default_random_engine generator; 2 std::uniform_int_distribu转载 2020-07-27 21:44:59 · 1317 阅读 · 0 评论 -
C/C++中Sleep函数的用法(for循环中产生的随机数一样解决方法之一)
有时我们使用for循环去产生随机数组时,发现其生成的随机数都一样,这和我们想要的不一样。通过查阅相关资料后发现,是因为当计算机的性能较快时,for循环运行时间非常短,srand(time(NULL))每次都返回相同的值。原因:用系统时间做随机种子并不保险,如果应用程序在一个较快的计算机上运行,则该计算机的系统时钟可能没有时间在此构造函数的调用之间进行更改,Random 的不同实例的种子值。解决方法一:使用Random ra=new Random();解决方法二:使用Sleep()函数..原创 2020-07-27 21:01:56 · 5001 阅读 · 0 评论 -
C/C++中均匀分布和Possion
泊松分布适合于描述单位时间内随机事件发生的次数的概率分布。如某一服务设施在一定时间内受到的服务请求的次数,电话交换机接到呼叫的次数、汽车站台的候客人数、机器出现的故障数、自然灾害发生的次数、DNA序列的变异数、放射性原子核的衰变数等等。泊松分布的概率质量函数为:在产生泊松分布时,首先需要产生均匀分布,下面给出了均匀分布和Possion分布的代码。#include <math.h>#include <stdlib.h>//均匀分布double...原创 2020-07-27 17:54:49 · 1012 阅读 · 0 评论 -
C/C++中结构体动态内存的管理(malloc和free)
这两天在用C++写仿真代码时,用到了大量的结构体,但是最后的结果总是出错或者编译运行时就会出现错误。经过在网上查阅大量资料和博客,发现是因为使用结构体时没有考虑内存的分配。而在定义结构体这种数据类型的时候是不会分配内存空间的,只有在定义变量的时候,才会分配。经过查阅资料,我认为下面的博主讲解的很详细,所以写下这篇文章用来提醒自己,方便自己以后查阅资料!C语言中内存的管理主要是依据malloc和free实现的,其中malloc主要是实现内存的分配,而free则是实现内存的释放。虽然这是我们已经很熟悉的,但转载 2020-07-17 20:48:34 · 3530 阅读 · 1 评论 -
C/C++ 中break/continue/goto用法
break语句作用:用于跳出选择结构或者循环结构break使用的时机:1、出现在switch条件语句中,作用是终止case并跳出switch。2、出现在循环语句(for/while/do-while)中,作用是跳出当前的循环语句。3、出现在嵌套循环中,跳出内层循环语句。示例:1、switch中使用#include <iostream>using namespace std; int main() { // break的使用时机 // 1、出现在s原创 2020-07-12 20:59:08 · 919 阅读 · 0 评论 -
gcc和g++的区别
gcc和g++的区别 我们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++,或者说编译用gcc,链接用g++,一时也不知哪个说法正确,如果再遇上个extern "C",分歧就更多了,这里我想作个了结,毕竟知识的目的是令人更清醒,而不是更糊涂。误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认...转载 2020-07-08 18:08:02 · 485 阅读 · 0 评论