c++
落春只在无意间
不能打败我的只会让我更强大
展开
-
c语言解惑 ----读书笔记
c语言解惑前言左值和右值首地址没有初始化指针和空指针指针的初始化小段存储和大端存储数组函数文件结构多文件结构多文件中的函数设计头文件原创 2023-03-26 12:57:18 · 1119 阅读 · 3 评论 -
c++ VS2019中使用Log4cplus打印日志最新介绍、详细编译过程及使用
VS2019中使用Log4cplus打印日志简述一、log4cplus介绍二、log4cplus下载三、log4cplus配置3.1 对log4cplus文件借助vs2019进行编译对目标程序进行配置四、测试五、扩展知识补充 ---- vs2019附加库、包含目录等配置原创 2022-10-19 23:56:17 · 2147 阅读 · 2 评论 -
c++中实现域内,左,右对齐的方法
需要包含头文件实现域内左对齐int main() { cout.setf(ios::left);// for (int i = 0; i < 5; i++) cout << setw(8) << i + 41;//setw()括号中的数字为左对齐的宽度}输出:实现域内右对齐int main() { cout.setf(ios::right);// for (int i = 0; i < 5; i++) cout << setw(原创 2021-01-25 12:06:54 · 4699 阅读 · 0 评论 -
c++中的new与delete运算符
** C++语言中内存的管理使用new和delete运算符实现分别用于内存申请与内存释放**1.new运算符基本格式:类型说明符 * 指针变量名 = new 类型说明符格式二类型说明符 * 指针变量名 = new 类型说明符 [ ]格式一用于申请一块内存空间,储存一个指定类型的数据,例如:int * a=new int;其中,new int 是告诉编译器需要申请一快能够存放一个int 类型数据的内存空间,编译器申请成功后把申请到的内存地址赋值给指针变量a,通过指针变量a使用申请到的这块.原创 2021-01-21 20:55:46 · 1394 阅读 · 0 评论 -
c++中函数模板的显示具体化
函数模板的显示具体化。函数模板存在局限性,当定义函数模板时,我们始终假定函数体中的语句是合法的。例如定义如下函数模板:template <typename T>T add(T x, T y){ return x + y;}如果T是内置数据类型,则x+y是合法的。例如,Ad(1,2)是合法的。但是,如果T用int*替换则是错误的,因为两个指针相加没有任何意义。例如,Add(a,b)是非法的,其中a,b声明如下:int a[5] = { 1,2,3,4,5 };int b[5].原创 2021-01-27 14:59:29 · 814 阅读 · 0 评论 -
c++运算符重载中很多人易忘的小细节
运算符重载的基本格式运算符重载的本质就是函数重载类型说明符 operator 运算符 (参数列表){函数体;//实现运算符功能的代码。}如果把 operator运算符”看作一个整体,把它看成函数名,上述定义不就是函数的定义吗?其中, operator是关键字,函数的名字就是用 operator和其后的运算符共同组成的标识符共同组成的标识符。运算符重载的基本规则运算符重载时要遵循一定的规则,具体规则如下。(1)只能重载C语言中已有的运算符,不能虚构新的运算符。(2)运算符重载后不改变.原创 2021-01-25 18:59:59 · 120 阅读 · 0 评论 -
c++中组数的替代方案
向量 vectorvector可以看作一个动态数组,用于存储一组数据类型相同的数据,对数据元素的个数没有限制,即可以把 vector看作一个存放任意数据类型的“容器”。使用 vector需要包含头文件< vector>。声明 vector对象的方法有多种,例如:vector〈类型说明符〉对象名;vector〈类型说明符〉对象名(元素个数);vector〈类型说明符〉对象名{元素初始列表};其中,类型说明符说明了 vector容器中存储的数据类型,可以是基本数据类型,也可以是构造数.原创 2021-01-20 21:44:01 · 391 阅读 · 0 评论 -
c++中运算符重载方式中你易遗漏的小细节
运算符重载函数相当于类来说有两种存在方式:1.重载为类的成员函数。2.重载为类的友元函数。重载为类的成员函数。 如果把运算符重载为类的成员函数,则该函数么须通过对象调用,该对象就是运算符的其中一个操作数,在运算符重载函数中通过this指针隐含(或显式)地访问对象的成员。如果把双目运算符重载为类的成员函数,则该运算符有两个操作数,左操作数是调用运复符重载函数的对象,而右操作数作为运算符重载函数的实参传递到运算符重载函数中双目运算符重载为类的成员函数时,其调用的一般格式如下:**左操作数 运算.原创 2021-01-26 21:27:53 · 561 阅读 · 0 评论 -
定义一个集合类Set,(考察动态数组的建立)
完整题目定义一个整形数集合类Set,请通过创建动态分配的整数数组(使用new运算符)存放整数值,且数组的大小要能够根据包含元素的个数动态的变化。集合中,元素的顺序无关紧要,每个元素至多出现一次。实现如下函数:(1) 构造函数创建一个空集;(2) 复制构造函数实现深复制;(3) add 函数向集合中插入一个整数; (4) 析构函数。在main函数中对上述函数进行测试。以下是代码,里面有很详细的解释#include<iostream>using namespace std;class S原创 2021-03-26 17:36:03 · 2006 阅读 · 1 评论 -
面向对象与面向过程的区别
面向对象的概念出现之后为之相对而提出的。 面向过程的概念是在 是一种自上而下的设计方法,以事件为中心,以功能为导向,分析出解决问题的步骤,按照模 面向过程程序设计 块划分出程序任务并由函数实现,依次执行各函数,实现功能。例如,设计程序统计某个班 C++语言的考试成绩,计算最高分和平均分。面向过程程序设计的思路可能是这样的。首先把学生的考试信息输入程序中,在该过程中,要考虑如何组织学生的考试信息、 需要包含哪些数据(学号、姓名、成绩)、是用数组还是用结构体表示是顺序存储还是链式存 储等。可以.原创 2021-01-23 12:56:34 · 352 阅读 · 0 评论 -
c语言,c++求最大公因数与最小公倍数方法集合
首先要了解,求两个数的最小公倍数只需用两个数的乘积除以最大公因数就可以得到了,所以我们的目标就是找最大公因数c语言第一种方法用辗转相除法:辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求两个正整数之最大公约数的算法。它是已知最古老的算法, 其可追溯至公元前300年前。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大.原创 2021-01-11 23:30:39 · 3401 阅读 · 1 评论 -
vector模板,初学者必读
vectorvector 称为向量,是一种类模板,其声明包含在头文件< vector>中,所以使用veto 时需要包含头文件< vector> 。vector是一种支持高效地随机访问和高效地向尾部插入新元素的容器,它一般实现为一 个动态分配的数组,所以在程序开发过程中,使用vector作为动态数组是非常方便的类 似于数组, vector分配连续的存储空间存储数据,个相邻数据在存储空间上是相邻的。所 以, vector可以像数组一样实现随机访问。与数组不同的是, v.原创 2021-01-28 14:32:33 · 765 阅读 · 0 评论 -
很多人都不知道的小秘密,c++中拷贝分为两种
深拷贝与浅拷贝下面为作者的总结以深刻理解深拷贝和甜拷贝深拷贝:如果创建类对象时,相应的构造函数内用运算符new为对象的数据成员申请内存空间,那么在析构函数中应该用运算符 delete释放相应的内存空间。当创建对象并用已经存在的对象进行初始化时,必须自定义拷贝构造函数。在拷贝构造函数内使用new运算符为新对象申请内存空间,把已经存在的对象的内存空间中的数据拷贝到新对象申请的内存空间中,这种拷贝过程即称为深拷贝。 浅拷贝:与深拷贝的概念相对应,不采用上述深拷贝方法实现对象的拷贝即称为浅拷贝。 通常.原创 2021-01-25 11:45:02 · 182 阅读 · 0 评论 -
C++中使用new和delete运算符实现二维数组的操作
线上代码,解析在下方List item#include <iostream>#include <string>#include <cstring>#include <iomanip>using namespace std;int main() { int m = 4, n = 5;//处理一个m行n列的二维整型数组 int * *p = new int *[m];//申请吗个元素,每个元素是int *类型的内存空间 for (int原创 2021-01-22 10:55:01 · 1291 阅读 · 1 评论 -
c++模板之函数模板
函数模板函数模板的定义格式如下:**template <模板参数>类型说明符 函数名 (参数列表){函数体;}**例如:template <typename T>void swap(T& x, T& y){ T z = x; x = y; y = z;}其中, template是声明模板的关键字。模板参数有两种形式:①用 typename关键字声的类型参数;②内置数据类型或自定义数据类型。在标准C++98添加关键字 typena.原创 2021-01-27 13:59:52 · 254 阅读 · 0 评论 -
c++中用于字符输入的函数
1.get()使用gas函数可以输入一个或多个字符,有多种重载格式,其函数原型如下:(1)int get();(2) istream& get(char& c);(3) istream& get(char * s, streamsize n);(4) istream& get(char* s, streamsize n, char delim);(5) istream& get(streambuf& strbuf);(6) istream&am.原创 2021-01-30 16:38:04 · 1315 阅读 · 0 评论 -
C++中基于范围的for循环
程序的基本结构包括三种:顺序结构,选择结构(也称分支结构)和循环结构(也称 程序的基本控制结构包括三种:顺序结构、选择结 重复结构)。循环结构的实现方法比较多,除了使用 while()、 do while()和for()循环之外, C++11还提供了一种称为基于范围(Rane- based)的for循环。其基本格式如下: for(变量声明:表达式) { 语句序列; }其中,表达式通常是一个数组名或容器对象。基于范围的for循环使用了一个称为范 围变量的内置变量,每次基于范围的for循环.原创 2021-01-22 12:09:54 · 471 阅读 · 0 评论 -
算法训练之STL使用汇总
STL使用汇总vectorvector常用函数vector 创建二维数组listlist常用函数遍历listeraseinsertsplicequeue常用函数priority_queuepriority_queue常用函数大根堆,小根堆setset常用函数find()erase()set取并集,交集,差集set_unionset_intersectionset_difference注意事项bitset1、构造函数:2、常用操作:string数字的字典原创 2021-10-24 23:13:14 · 863 阅读 · 0 评论 -
BFS 保存路径模板
因为BFS 相当于在一棵树上进行层次遍历。那么我们可以在每一个节点处记录下其父节点的坐标。然后从终点位置,回溯输出即可。代码:#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<string>#include<queue>#in原创 2021-08-16 15:28:10 · 535 阅读 · 0 评论 -
算法题目中元素为二元(坐标)的几种解决方法
方法一,开结构体struct pp{ int x,y;};pp st;st.x=sx;st.y=sy;q.push(st); //q是队列方法二、利用pairq.push(pair<int, int>(sx, sy));方法三、利用 emplaceq.emplace(sx, sy);原创 2021-08-15 22:17:15 · 183 阅读 · 0 评论 -
Tire 模板(建议收藏)
大家记得通过这个图,更好理解一般有两种方法建立,一个是链式,一个就是二维数组。下面这个模板是链式,数据结构:struct Tree{ int num;//判断此节点是否为空的(就是一棵树的结束点) Tree* next[26];//这个是这棵树的子节点 Tree() { num = 0; for (int i = 0; i < 26; i++) { next[i] = NULL; } }//这是一棵树}*root;//建立一个树根插入:void in原创 2021-08-14 19:51:35 · 140 阅读 · 0 评论 -
c++ map通过值找键与通过键找值得方法(全)
map通过值找键countfind通过键找值通过值找键countif (ans.count(key1)) //查键 cout << ans[key1] << endl; else cout << "what?" << endl;count():如果找到则为真findmap<string, string>::iterator iter;iter = ans.find(key); //返回的是迭代器中的位置//原创 2021-08-12 20:50:19 · 8527 阅读 · 0 评论 -
单调队列(一套模板通吃)
单调队列利用双端队列实现初始化双端队列维护队头是最大元素维护队头是最小元素利用数组实现维护队头是最大元素顾名思义,就是用一点巧妙的方法,使得队列中的元素全是单调递增或递减,常常用来解决滑动窗口的一系列问题。好了,废话不多说,上正题。模板思路在代码中,超详细,看完你就悟了。利用双端队列实现初始化双端队列void init(){ //必须从前边删 while (!q1.empty()) q1.pop_front(); while (!q2.empty()) q2.pop_front();原创 2021-08-11 15:27:08 · 119 阅读 · 0 评论 -
一套模板通吃单调栈
单调栈下一个更大元素的位置(下标)下一个更小元素的位置(下标)前一个更大元素的位置(下标)前一个更小元素的位置(下标)总结声明:位置是从1开始的,如果不存在记为-1下一个更大元素的位置(下标)int ans[n+10];stack<int>s; for (int i = n; i >= 1; --i) { while (!s.empty() && a[s.top()] <= a[i]) s.pop(); ans[i] = s.emp原创 2021-08-10 18:40:07 · 90 阅读 · 0 评论 -
动态规划/贪心总结(一)
最长递增子序列(一维)子序列是可以不连续的。,dp[i]是i位置以num[i]结尾的最长子序列长度状态转移方程:dp[i]=max(dp[i],dp[j]+1),j<i且满足num[i]>num[j] dp[i] = max(dp[i],dp[j]+1) ,j<i且满足num[i]>num[j] dp[i]=max(dp[i],dp[j]+1),j<i且满足num[i]>num[j]代码:memset(dp,1,sizeof(dp)) //初始化为1,因为自己原创 2021-08-05 12:46:46 · 115 阅读 · 0 评论 -
Daydream
**题意:**s是否由给定的几个字符串组成。思路:因为字符串的结尾只能是“r”,”m”,”e”.所以可以从后往前判断。If不是以这这为结尾就输出“NO”,否则截取字符串来比较。**知识点:**substr(size_type _Off = 0,size_type _Count = npos)一种构造string的方法形式 : s.substr(pos, len)返回值: string,包含s中从pos开始的len个字符的拷贝(pos的默认值是0,len的默认值是s.size() - pos,即不加原创 2021-08-04 12:02:22 · 105 阅读 · 0 评论 -
使用seek()函数与read()快速实现读取文件中的一段数据
seek()函数read()函数大致做法char map[10][10]; file.seekg(sizeof(map)*(gate-1));//偏移量,第二个参数默认的话就是当前文件指针所在的位置 file.read(*map,sizeof(map)); file.close();原创 2021-05-01 15:41:15 · 927 阅读 · 0 评论 -
c++备考期末必看知识点(一篇就够了)
一.关于C++的常用注释的三种方法简要:第一种方法:(两个斜杆)/ /第二种方法:()/ * * /第三种方法:使用预处理形式 #if 0 #endif详细可以参考该篇添加链接描述二.c++中的作用域 四类(函数原型作用域,局部作用域,类作用域,命名空间作用域)简要:1.函数原型作用域:此作用域为c++程序中最小的作用域,生存周期最短。(即函数形参,在函数的原型声明时的括号里面的形参的作用域就是函数原型作用域。)切记是在函数声明中不是定义例:int func(int i)原创 2021-04-20 00:02:41 · 2522 阅读 · 0 评论 -
c++初学者使用文件流需要了解的一些坑(持续更新)
字符读取篇一:“>>” 与 get()的区别(1)>>操作符会忽略前面的空白符和换行符,但不会越过后面的换行符和空白符。(2)get()方法不会略过任何符号。二,利用peek()判断读取完毕 该调用形式为cin.peek() 其返回值是一个char型的字符,其返回值是指针指向的当前字符,但它只是观测,指针仍停留在当前位置,并不后移。如果要访问的字符是文件结束符,则函数值是EOF(-1)。其功能是从输入流中读取一个字符 但该字符并未从输入流中删除 若把输入流比作一个 栈类原创 2021-04-16 17:10:10 · 185 阅读 · 0 评论 -
在c++使用文件流(初学者必看)
文本篇1.需要包含头文件2.实现文件读写操作的步骤1.创建文件流对象。(有别于在c语言中使用的文件指针)。c++:ofstream fout;//输出流,将程序运行的结果输出到 文件中ifstream fcin;//输入流,将文件中的数据提取出来c:FILE * fp;//文件指针2.打开文件,使文件流对象与文件建立关联。使用open()函数ofstream fout;fout.open("文件名","打开方式");打开方式大致有以下几种:a.ios::in ; 全词:i原创 2021-04-16 16:57:20 · 2037 阅读 · 0 评论 -
文件处理之解决使用 feof(c语言)或(fin.eof())出现多读问题
首先要明确当到达文件末尾时feof()与fin.eof()为真所以我们是利用!feof()或 !fin.eof()来循环的。我们通过分析 fin.eof()来得出结果。1.eof()函数的作用是判断 错误状态流标志 eofbit()是否被设置,若被设置则eof()为true;2.那么什么时候被设置呢?首先了解一个概念:文件位置指针。文件位置指针可以虚拟化为一个指针,该指针指向文件当前的读/写位置。文件刚刚打开时,文件位置指针指向文件首部,随着读/写操作的进行,文件位置指针自动移动。当文件位置指原创 2021-04-14 14:37:46 · 1086 阅读 · 0 评论 -
c++使用cin输入数据
输入单个字符 char ch; cin>>ch;即使输入流是abc, 也只提取字符a赋值给变量ch, 剩余字符仍然留在输人流中。在默认输人格式下无法提取空格等空白符, 空白符会被跳过。但是, 可以使用操纵子noskipws读取空白符,例如:char ch;cin>>noskipws>>ch;输入数值当需要输人数值型数据时、输人流中被读取的数据必须是数字,否则读取失败。例如:int n;cin>>n;如果输人流是abc, 则读取失败。此原创 2021-04-14 14:07:39 · 2407 阅读 · 0 评论 -
使用 cout 输出数据之控制输出格式(二)
使用操纵子操纵子(Manipulator) 也称操作符, 是一种功能和类 ios_base的成员函数相同, 但使用更方便的格式控制函数,程序员可以直接在输出流中插人操纵子控制程序的输出格式,既简化了程序的编写,又使程序的结构变得更清晰。C++语言提供了两种操纵子:无参操纵子(见表9-2)和有参操纵子(见表)。有参的操纵子1.setiosflags(fmtflags flag)用flag设置格式标志(为我在第一篇中列出的)setiosflags(ios::showbase);2.resetio原创 2021-04-14 13:43:11 · 209 阅读 · 0 评论 -
使用 cout 输出数据之控制输出格式(一)
cout调用格式化函数ios_base类提供了一组设置格式化状态标志的成员函数, 包括 setf() 、unset f() 和flags() .格式化状态标志通过一个二进制位设置,如果设置了某个状态标志,则对应位为1;否则为0.ios_base类中用于设置输出格式的状态标志。(不是函数),如表所示介绍几个常用的函数:(1) setf()用于设置状态标识,把指定位的状态标识为1.格式一功能:用flag设置流格式, 保留流中原有格式, 相当于在原有流状态标志的基础上添加flag标志。例如:(重要)原创 2021-04-14 10:22:57 · 4866 阅读 · 0 评论 -
使用cout输出数据之使用成员函数
几个常用的成员函数:1.put()原型:ostream & put(char c);功能:把一个字符型变量的值输出到显示器上, 函数返回ostream类对象的引用, 所以该函数可以被连续调用。例如:cout.put('A').put('B');2.write()原型:ostream & write(const char *s,streamsize n);功能:把一个字符串(指针s表示)的个字符插大输出流。**如果字符串的长度不小干n, 则只输出字符串的前n个字符, 否原创 2021-04-14 09:48:13 · 1001 阅读 · 0 评论 -
基类与派生类之间的转换关系
一. 派生类到基类的转换:1.可以使用派生类指针初始化基类指针,同样也可以使用派生类的引用或对象初始化基类的引用,注意这里提到的是对象的指针和引用而不是对象本身;(但是,在使用基类指针(或引用)指向(或引用)派生类对象时需要注意以下几点。(1)把派生类对象的引用或指针转换为基类引用或指针被称为“向上”强制转换(Up casting) , 这种转换不需要显式进行(相反, 把基类指针或引用转换为派生类指针或引用称为“向下”强制转换(Down casting) 。如果不使用显式类型转换, 这种“向下”强制转原创 2021-04-13 21:15:33 · 3239 阅读 · 2 评论 -
c++重载大于号与小于号(”>”和”<”)
关系运算符的重载关系运算符用于比较两个数据的大小,关系运算的结果是布尔值。C++语言中有六个关系运算符:>、>一、<、<一、=一、!一,这六个关系运算符都可以进行重载。在具体应用中、关系运算符都要成对重载。例如,重载“>=”运算符,同时应该重载“<一“心算符。当成对重载关系运算衬时,可以把一个运算符的比较工作委托给另外一个已经实现的运算、如,已经重载了“>=“运算符,那么在重载“<=”运算符时直接调用“>=”运算符重载函数即可。关系运算的结果原创 2021-04-13 20:23:00 · 18229 阅读 · 4 评论 -
c++重载自增与自减运算符(前置与后置)
运算符重载要点:1. 后置的运算符要带一个整型参数(用来与前置运算符区分开)。2.后置的返回值不要用引用(否则会因为是局部变量导致返回为一个不存在的值)。3.再在置中要定义一个临时变量来返回之前的值。4.在后置运算符中可以使用前置运算符来简化。代码(内有详解)#include <iostream>using namespace std;class point { public: point(int x1 = 0, int y1 = 0) {//构造函数,带默认参数原创 2021-04-13 19:32:32 · 792 阅读 · 0 评论 -
如何实现运行时刻的多态?(c++)
首先,要明确运行时刻的多态依赖于类的继承与虚函数。(可以去看我之前写的文章)基本做法是:在基类与派生类中定义函数原型相同的两个虚函数,然后定义基类的指针,用积累的指针指向不同的派生类对象,通过虚函数即可实现运行时多态。代码例子:#include <iostream>using namespace std;class vehicle { public: vehicle(int n = 0, int m = 0) { //初始基类的构造函数 axspeed = n;//对数原创 2021-04-13 17:27:20 · 1040 阅读 · 0 评论 -
c++类模板(c++细节篇十一)
类模板的声明类模板:template <模板参数表>class 类名{类成员声明}如果需要在类模板以外定义其成员函数,则要采用以下的形式:template <模板参数表>类型说明符 类名<模板参数>::函数名(参数表)比原先变化时类名后多了一个 模板参数。静态成员不能放模板类。例:static int count;//定义在类外template <typename T>int 类名<T>::count=0;**原创 2021-04-09 15:39:58 · 71 阅读 · 0 评论