c++个人学习笔记
个人用来记笔记,方便分类,无意侵权
因为能力有限,欢迎大佬指出错误。
ad_m1n
这个作者很懒,什么都没留下…
展开
-
getopt不能重复调用的bug(重复调用无解析)
在一个while循环中使用getopt解析命令,发现第一次可以正常解析,第二次就不解析了。原创 2023-06-13 22:21:18 · 138 阅读 · 0 评论 -
c++pair对组
功能描述:成对出现的数据,利用对组可以返回两个数据两种创建方式:pair<type, type> p ( value1, value2 ); pair<type, type> p = make_pair( value1, value2 );示例:#include <string>//对组创建void test01(){ pair<string, int> p(string("Tom"), 20); cout << "转载 2021-01-21 21:09:24 · 157 阅读 · 0 评论 -
c++利用list容器和自定义排序规则来实现自定义排序
案例来自于黑马程序员的课件,因为找不到转载的网址,没办法只能标成原创。这部分包括两个知识点: 1.自定义排序规则的编写 2. 自定义排序规则怎么嵌入到sort排序函数中知识点1: 1.自定义排序规则的编写 类似于这样:person是自定义结构体bool sort_list(person& p1, person& p2) { if (p1.age == p2.age) return p1.heigh...原创 2021-01-21 19:12:17 · 640 阅读 · 2 评论 -
c++vector容器的内存收缩和预留内存
引言:利用swap函数和匿名对象来实现对容器所占用内存的及时回收#include<iostream>#include<vector>using namespace std;void test01(){ vector<int>v; for(int i=0;i<1000000;i++) //容器的容量相当大,并且占用的内存也很大 v.push_back(i); cout<<"容器容量 "<<v..原创 2021-01-19 18:40:03 · 1304 阅读 · 1 评论 -
c++模板元编程编写简单的递归
模板元编程实际上指的就是在模板实例化的同时利用编译器完成一些简单的计算任务。通过模板元编程可以把一些需要运行时计算的任务放到编译时候来做,从而提高程序的运行时的效 率。基本操作语法:#include<iostream>using namespace std;template<int N, int M>struct meta_func{ static const int value = N+M; static const int value1 ...原创 2021-01-18 21:08:19 · 459 阅读 · 0 评论 -
c++模板特化和偏特化
一:模板特化 1.函数模板特化 2.类模板特化二:模板偏特化 主要是类模板的偏特化,函数模板的偏特化没必要,因为可以通过重载来完成。 1.类模板的偏特化 2.函数模板的重载...原创 2021-01-18 19:39:31 · 435 阅读 · 0 评论 -
c++链表和队列
队列和栈是描述数据存取方式的概念,队列是先进先出,而堆栈是后进先出;队列和栈都可以使用数组或者链表实现。 数据存储结构:它是计算机的一个概念,简单讲,就是描述数据在计算机中存储方式的学科;常用的数据存储 方式就两种:顺序存储,非顺序存储!顺序存储就是把数据存储在一块连续的存储介质(比如硬盘或内存)上----举个例子:从内存中拿出第100个字节到 1000个字节间的连续位置,存储数据;数组就是典型的顺序存储!非顺序存储就是各个数据不一定存在一个连续的位置上,只要每个数据知道它前面的数据和后 面的...原创 2021-01-18 10:51:34 · 440 阅读 · 0 评论 -
c++字符串输入流istringstream
作用:从string流中提取特定类型的数据。使用之前必须包含 #include<sstream>头文件示例1:从string中提取整型数字,从而实现了以空格为分隔符的数字提取#include <iostream>#include<sstream>#include<string>using namespace std;template<class T>inline T fromString(const string &a..原创 2021-01-17 18:40:28 · 429 阅读 · 0 评论 -
c++链表先进先出和先进后出的简单写法
一:先进先出#include <iostream>using namespace std; struct student{ long num; float score; student *next; }; student* create() //定义函数。此函数带回一个指向链表头的指针{ student *head=NULL; student *p1,*p2; int n=0; p1=p2=new student; //开辟一个新单元原创 2021-01-17 10:21:03 · 1685 阅读 · 0 评论 -
c++cout输出函数的格式控制
表 1 罗列了 ostream 类中可实现格式化输出的常用成员函数,以及它们各自的用法。表 1 ostream 类的成员方法 成员函数 说明 flags(fmtfl) 当前格式状态全部替换为 fmtfl。注意,fmtfl 可以表示一种格式,也可以表示多种格式。 precision(n) 设置输出浮点数的精度为 n。 width(w) 指定输出宽度为 w 个字符。 fill(c) 在指定输出宽度的情况下,输出的宽度不足时用字符 c 填充(默认情况是...原创 2021-01-13 09:25:47 · 467 阅读 · 0 评论 -
三种排序方式和折半查找
一.直接插入排序template<class T>void insert_sort(T a[],int n){ for(int i=0;i<n;i++){ T temp=a[i]; int j=i; while(j>0&&temp<a[j-1]){ a[j]=a[j-1]; j--; } a[j]=temp; }}二:选择排序template<class T>void my_swap(T&原创 2021-01-12 22:37:37 · 961 阅读 · 0 评论 -
c++assert函数
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行。#include <assert.h>assert( int expression ); assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它打印一条出错信息,然后通过调用 abort 来终止程序运行。如下图所示:#include <iostream>#include<assert.h>using nam原创 2021-01-09 14:18:23 · 555 阅读 · 0 评论 -
c++自定义类型转换
一:C++的内置类型和用户自定义类型的互相转换1.内置类型转换为自定义类型。 需要使用转换构造函数。带单参数的构造函数(基本数据类型=>自定义数据类型)这类构造函数称为转换构造函数。class Complex { public: Complex():ele1(0.0){}; Complex(double r, double i):ele1(r),ele2(i){}; Complex(double r) // 转换构造函数 { ..原创 2021-01-09 11:40:39 · 2187 阅读 · 0 评论 -
c++exit和return
一:exit的作用exit 是用来结束一个程序的执行的,把控制权交给OS 。void fun() { cout << "1" << endl; exit(1); cout << "2" << endl;}int main() { for(int i=0;i<10;i++) fun();}十次循环只进行了一次就退出了。二:return退出当前函数的执行,return会自动调用对象的析构函数,...原创 2021-01-08 21:36:11 · 229 阅读 · 0 评论 -
c++-利用二分变步长积分算法求定积分
8.5.1 p324原创 2021-01-08 17:39:41 · 454 阅读 · 0 评论 -
c++const放在类的成员函数声明的()后
在类成员函数的声明和定义中,const的函数体内部不能对其数据成员进行修改操作。从而达到了保护数据防止数据被任意修改的作用const的对象,不能引用非const的成员函数。#include <iostream>using namespace std;class number{ int num=1; public: void print() const { num++; //这就是错的,因为不能修改类的数据成员 cout<<num<&l.原创 2021-01-07 18:14:20 · 199 阅读 · 0 评论 -
c++类的内嵌和类的继承(仅限共有继承)的深度探究。
在一些情况下,二者都可以完成规定的任务,但是他们二者其实是有优先使用场景的区别的。一.类的内嵌:”has-a” 的关系,如果类b中嵌入一一个类a的对象,那么就说明每一个类b的对象中都包含有一个类a的对象。是整体和部分的关系,b类对象包含了a类全部的数据,但不包括a类对象的对外接口。示例程序:class engine{public:void work(){} //发动机转动};class car{public:void move(){} //汽车移动private:e原创 2021-01-06 17:40:51 · 612 阅读 · 0 评论 -
c++类型兼容规则(下可代上)
前提:公有继承下。 类型兼容规则是指在任何需要基类的情况下,都可以用共有派生类来替代这个基类。(这个不难理解,因为我们公有继承不就是把基类的除了构造和析构函数外的所有成员全都纳入到子类中吗,所以公有继承的子类可以说基本上含有基类的所有东西)替代之后,派生类的对象就可以作为基类对象来使用,但是注意了,仅仅可以使用从基类继承的成员,子类新增的成员不能访问。规则如下:派生类的对象可以隐含转换为基类对象。 //隐含的意思就是直接用,不用特意在语句中写上一些转换的标记 派生类的对象可以初始化...原创 2021-01-06 14:25:56 · 738 阅读 · 0 评论 -
c++四种类型转换操作符和一些安全性问题
隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,提示程序员这一步有转换,是怎么样的转换,作用类似于注释(因为如果我们不用显式的类型转换,隐形的也可以完成一些转换,但是我们不会意识到,这就有可能造成危险)。 但是,这种强调风险的方式还是比较粗放,它并没有表明存在什么风险,风险程度如何。 再者,C风格的强制类型转换统一使用( ),而( )在代码中随处可见,所以也不利于使用文本检索工具(例如 Windows 下的 Ctrl+F、L...转载 2021-01-05 16:38:54 · 1149 阅读 · 0 评论 -
c++中动态内存分配的用法和注意点
背景: 对于计算机程序设计而言,变量和对象在内存中的分配都是编译器在编译程序时安排好的,这带来了极大的不便,如数组必须大开小用,(大开小用就是现在定义一个数组容量是100,实际使用了10,造成了极大的内存浪费),因此为了解决这个问题。我们引入了动态内存分配来解决了这个问题。一、动态内存的用法 因为new返回的就是一个指针类型,所以我们必须用同类型一个指针来承接(有一种特殊情况就是在继承的时候可以用父类指针指向子类对象)。 new和delete运算符是用于动态分配...原创 2021-01-05 15:25:12 · 1155 阅读 · 0 评论 -
c++指向类的非静态成员和静态成员的指针的用法
类的成员包括两种:数据成员和函数成员。 所以下面将从这两个方面来简介。一:数据成员声明语法:类型说明符 类名::*指针名; //声明指向数据成员的指针,注意这个指针和this指针一样,是每个实例化后的对象共有的eg:int point::*num_ptr;对指针赋值的语法:指针名=&类名::数据成员名ed:num_ptr=&point::m_a; //num_ptr是上面我们定义的指针的名字,point是我们自定义的类,m_a是poin...原创 2021-01-04 23:19:33 · 988 阅读 · 0 评论 -
c++创建二维数组的几种办法
方法一:#include <iostream>#include <vector>using namespace std;void test01() { //创建一个外层容器 vector<vector<int>>v; //创建一些内层容器,并赋值 vector<int>v1(10,1); vector<int>v2(10,2); vector<int>v3(10,3); //将原创 2021-01-03 23:14:29 · 11760 阅读 · 1 评论 -
c++stl—vector容器
STL中最常用的容器为Vector,可以理解为数组。语法:vector<类型名或者指针类型名字> 容器名; #include<vector>//使用之前必须包含头文件一、vector 的初始化:可以有五种方式,举例说明如下: (1) vector<int> a(10); //定义了10个整型元素的容器(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。 (2)vector<int> ...原创 2021-01-03 19:49:02 · 298 阅读 · 0 评论 -
c++stl的简介
基本概念: 简介STL(Standard Template Library,标准模板库) STL 从广义上分为:容器(container) 算法(algorithm) 迭代器(iterator) 容器和算法之间通过迭代器进行无缝连接。 STL 几乎所有的代码都采用了模板类或者模板函数STL六大组件STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。 算...转载 2021-01-03 18:01:29 · 125 阅读 · 0 评论 -
c++命名空间作用域
1. 我们一个大型的程序通常由不同模块构成,而且不同的模块又常常是由不同的人来开发。所以不同模块中的类和函数就有可能发生重名,这样链接的时候就会出现二义性甚至是多义性,这时候就用到了命名空间。千万注意:声明命名空间的时候千万不要写在函数体内部,这样会报错命名空间的语法:namespace 命名空间名{ 各种声明或定义}//我们也可以不写命名空间名,这样就是声明了一个匿名空间,如果我们有东西不想被其他文件看到,就放到这个空间里。可以定义多个匿名空间,每个匿名空间都是独立...原创 2021-01-02 09:51:05 · 829 阅读 · 0 评论 -
c++在主文件cpp中调用其他文件函数的方法
一:直接用和我们的数据成员必须加extern不同的是,你只需把待调用函数的声明写在其头文件中,然后在主函数中直接用就可以//test.h#ifndef TEST_H //注意,这里千万不要写成TEST.H,必须用下划线,用点不行#define TEST_Hvoid print();#endif//test.cpp#include<iostream>#include"test.h"using namespace std;void print() { cout原创 2021-01-02 09:15:25 · 4539 阅读 · 1 评论 -
c++递归中语句的执行顺序是怎样的?
案例一: void recurs() { statements1;//等待被执行的语句1 if(test) recurs();//调用自身,体现递归思想 statements2;//等待被执行的语句2} 分析:这里用分层思想更便于理解,首先执行statement1语句,然后判断是否符合test条件,如果符合,进入下一层recurs()调用,直到判断不符合条件为止(到这里为止,...原创 2021-01-01 16:53:05 · 788 阅读 · 0 评论 -
c++浮点数进制转换和整数取反小算法。
方法:乘R取整法十进制小数转换为R进制数时,可以连续的乘以R,直到小数部分变成0,每次相乘得到的结果的整数部分取出来就组成了R进制的数字。例如:0.3125转换为二进制的数字0.3125*2=0.625 //取整数部分 0,并取小数部分0.625参加下一次运算0.625*2=1.25 //取整数部分 1,并取小数部分0.25参加下一次运算0.25*2=0.5 //取整数部分 0,并取小数部分0.5参加下一次运算0.5*2=1.0 ...原创 2020-12-31 10:37:24 · 1167 阅读 · 0 评论 -
c++类模板的实际案例以及几个重要知识点
一:案例分析(本案例来自黑马程序员老师的课)案例描述: 实现一个通用的数组类,要求如下:可以对内置数据类型以及自定义数据类型的数据进行存储 将数组中的数据存储到堆区 构造函数中可以传入数组的容量 提供对应的拷贝构造函数以及operator=防止浅拷贝问题 提供尾插法和尾删法对数组中的数据进行增加和删除 可以通过下标的方式访问数组中的元素 可以获取数组中当前元素个数和数组的容量文件组织:二:实际代码1.My_array.hpp中的代码:#pragma..原创 2020-12-30 22:46:04 · 193 阅读 · 0 评论 -
c++编译预处理
在编译器对源程序进行实际编译之前,首先要由预处理器对程序文本进行预处理。预处理器提供了一组编译预处理指令和预处理操作符。预处理指令可以根据需要出现在程序的任何位置。1.#include指令也称为文件包含指令,其作用是将另一个源文件嵌入到当前源文件该点处。#include指令可以嵌套使用,假设有嵌入一个头文件file1.h,file1.h中又可以含有#include”file2.h“这条嵌入指令。2.#define和undef指令 #define有两个作用:一是:定义...原创 2020-12-29 16:48:18 · 249 阅读 · 0 评论 -
c++分文件编写的一些知识点
一:c++程序的一般组织结构 在规模较大的项目中,往往是多人同时编写,所以我们需要多个源程序文件,每个源程序文件(cpp文件)都称为一个编译单元。 c++的语法要求一个类的定义必须出现在所有使用该类的编译单元中(这也符合常理,就和写文章一样,你要用我的文章,你得把我得名字也附到你的文章中)。比较好的方法就是讲类的定义写在头文件中,类的实现写在一个新的cpp中,在这个新的cpp开头包含类的定义那个头文件。(还有一种办法也不错,就是直接将头文件的后缀改成.hpp,将类的定义和实现都写在.h...原创 2020-12-29 15:27:30 · 895 阅读 · 0 评论 -
c++数组指针和指针数组的深入理解
一:指针数组写法:int* p[10];//*p未用括号括起来,说明[]的优先级高,p先和[]结合成数组,在被前面的*定义为一个指针类型的数组。 顾名思义:就是一个指针类型的数组,既然是指针类型的数组,所以数组中存放的元素就是一个个指针,这就决定了我们不能随便为其赋值。废话少说,上代码。tip1.透过代码看本质。int* p[10] = {1};//这样为其初始化就会报错,因为数组里面的元素全是指针类型,不能用整型为其初始化。int* p[10] = { NULL };//这样做..原创 2020-12-28 23:33:57 · 4759 阅读 · 1 评论 -
c++在堆区中创建数组的一些注意事项
Q1:我们为什么好端端的不在栈中创建数组,偏要跑到堆区中哪?R1:栈中的空间是有限的,在面对一些长度很大的数组的时候,会有力不从心的感觉,所以我们选择了在堆区中。1.写法1.1堆区创建一维数组的写法类型名 * 指针名=new 类型名[数组长度]eg: int *p=new int[10]这就表示我们在堆区中创建了个int类型的一维数组,长度是10,并且用int类型的指针指向他来便于我们后期维护。注意:前后类型最好一致,或者可以转换。如果前面是string,后面是i...原创 2020-12-27 17:43:46 · 4552 阅读 · 2 评论 -
c++模板类的分文件编写和友元
1.7类模板分文件编写有两种组织方式:1.直接cpp型,仍然在.h头文件中写类的定义,在.cpp文件中写类的声明,然后直接包含cpp(不包含.h,因为模板类的函数只有在调用的时候才现产生,包含.h的话代码里面虽然有函数代码,但实际上并未产生函数,在cpp中才会产生,这是和普通函数不一样的地方) 2.hpp型,把类的定义和类的实现写到一个文件中,然后改成hpp文件,直接包含hpp文件就行(.hpp=.h+.cpp)下面先看1.包含.cpp...原创 2020-12-26 20:45:32 · 679 阅读 · 0 评论 -
c++类模板继承与类外实现语法
1.5 类模板与继承tip1:注意,类模板可以作父类,但是当子类继承他的时候需要在子类中指定标明参数列表,否则会报错,如下图所是:正确写法://父类模板类template<class T1,class T2>class base {public: T1 t1; T2 t2;};//子类class son :public base<int, string> {};tip2:如果想要更灵活的在构建对象的时候确立类型的话,就把子类也设置为模板类..原创 2020-12-26 17:01:40 · 425 阅读 · 0 评论 -
c++类模板写法和作用,成员函数的创建时机,传参方式
1.1类模板作用:建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表。语法:template<typename T>类解释:template — 声明创建模板typename — 表面其后面的符号是一种数据类型,可以用class代替T — 通用的数据类型,名称可以替换,通常为大写字母示例:#include <string>//类模板template<class NameType, class AgeType&原创 2020-12-26 13:26:06 · 479 阅读 · 0 评论 -
C++标准库的所有头文件及作用
C++标准库的所有头文件都没有扩展名。C++标准库的内容总共在50个标准头文件中定义,其中18个提供了C库的功能。 <cname>形式的标准头文件【 <complex>例外】其内容与ISO标准C包含的name.h头文件相同,但容纳了C++扩展的功能。在 <cname>形式标准的头文件中,与宏相关的名称在全局作用域中定义,其他名称在std命名空间中声明。在C++中还可以使用name.h形式的标准C库头文件名。C++标准库的内容分为10类:C1.语言支持 C2.输入/原创 2020-12-26 11:54:55 · 4190 阅读 · 0 评论 -
c++函数模板
1.1模板的概念模板就是建立通用的模具,大大提高复用性模板的特点:模板不可以直接使用,它只是一个框架 模板的通用并不是万能的 C++另一种编程思想称为泛型编程,主要利用的技术就是模板 C++提供两种模板机制:函数模板和类模板 函数模板语法:template<typename T> 其中typename可用class替换,函数声明及定义 解释:template — 声明创建模板typename — 表面其后面的符号是一种数据类型,可以用c..原创 2020-12-26 11:35:06 · 146 阅读 · 1 评论 -
c++虚析构和纯虚析构
4.7.5 虚析构和纯虚析构纯虚析构的使用场景:多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。(1.父类指针指向子类对象,2.子类在堆区有数据)解决方式:将父类中的析构函数改为虚析构或者纯虚析构虚析构和纯虚析构共性:可以解决父类指针释放子类对象 都需要有具体的函数实现虚析构和纯虚析构区别:如果是纯虚析构,该类属于抽象类,无法实例化对象虚析构语法:virtual ~类名(){}纯虚析构语法:virtual ~类名() = 0;类原创 2020-12-26 10:51:26 · 466 阅读 · 0 评论 -
c++纯虚函数以及抽象类
我们会发现,当父类设置了虚函数后,他函数里面的东西实际上没什么用,调用的都是子类的,所以我们干脆设置为纯虚函数,什么都不写。纯虚函数: 格式 virtual 返回值类型 函数名(参数列表)=0;eg : virtual int fun()=0;抽象类:父类只要含有纯虚函数就是抽象类,子类必须重写虚函数,否则也是抽象类。抽象类无法实例化对象,如下图所示:子类必须重写虚函数,否则也属于抽象类,也无法实例化对象。案例(来自黑马老师)://抽象制作饮品class...原创 2020-12-26 10:32:41 · 154 阅读 · 0 评论