文章目录
-
- 计算长度使用左闭右开的方法
- [getline(解决输入空格问题和给一个输入的界限)](#getline(解决输入空格问题和给一个输入的界限))
- [stoi(字符串转整形)](#stoi(字符串转整形))
- stoi(整型转字符串型)
- reverse(反转函数)将字符串立志
- [静成员变量在类外初始化;但是有特例:const static int类型可以在类内初始化;而const static char类型不能在类内实现初始化;](#静成员变量在类外初始化;但是有特例:const static int类型可以在类内初始化;而const static char类型不能在类内实现初始化;)
- 一般的string类型中的capacity不包含'\0'
- 类的初始化是顺序是和声明的顺序相同的;
- [范围for函数;如果 在函数体内改变数组使用auto定义的变量;进行改变数组不会改变;](#范围for函数;如果 在函数体内改变数组使用auto定义的变量;进行改变数组不会改变;)
- std内的容器的头文件的使用
- clear()
- 堆和栈的生长方向
- 栈和堆的动态空间建立和释放
- 3.new与malloc的属性区别
- 4.类模板
- 参数类型强转
- 迭代器在g++环境下是指针;在其他条件下比一定是指针;(迭代器初始化多使用auto来定义)
- 迭代器可以使用加法运算;+-数字都可;
- 除了string类定义了流插入和流提取;其他类都没有定义;原因:其他类都额可以使用范围for等循环来实现;string因为有字符串所以必需要定义一个;
- [异或知识点:将其第一操作数的每个位与其第二操作数的相应位进行比较。 如果其中一个操作数中的位为 0,而另一个操作数中的位为 1,则相应的结果位设置为 1。 否则,将对应的结果位设置为 0。](#异或知识点:将其第一操作数的每个位与其第二操作数的相应位进行比较。 如果其中一个操作数中的位为 0,而另一个操作数中的位为 1,则相应的结果位设置为 1。 否则,将对应的结果位设置为 0。)
- 当想只是使用类内的函数时;创建匿名对象;
- 防止被重命名函数![在这里插入图片描述](https://img-blog.csdnimg.cn/8f4fc4679db94cf2aa43b488e159fdb2.png)
- 0和另一个数异或的结果是这一个数;
- stl中的cbegin()没什么用;原因:begin()这里有const的版本重命名函数
- 扩容的写法:
- size_type就是size_t;
- 匿名对象具有常性;
- [拷贝构造函数和 构造函数的隐式转换](#拷贝构造函数和 构造函数的隐式转换)
- 默认构造函数
- 注意从后向前循环时间使用一个变量大于等于0时间;使用size_t类型会出错;需要使用强制类型转换将类型转位int类型;
- new创建的数组如果太大就会抛异常
- 抛异常
- 迭代器类型的组成:
- typedef会受到访问限定符的限制;
- 内置类型也有默认构造函数
- vector类型容器扩容后迭代器将无法使用;
- 算法库的头文件:<algorithm>
- 当一个类里面全部都是使用的是共有;就不使用class而是使用struct;
- 类内函数不必按照使用顺序来进行定义;
- const迭代器:
- [list 的->的实现](#list 的->的实现)
- 函数内出现模板类去调用内嵌类型或静态成员变量;
- 该函数可以使用传参数来进行实例化;
- 将容器定义为模板,让编译器来识别是哪个容器;来进行函数操作
- 各容器的定义的解读
- linux的指令大部分改变的是文件的属性;
- 文件内存包含:1.数据2.属性;
- Linux的隐藏文件是以.来领先的;
- linux指令:
- [Xshell 全屏的方法:ALT+回车](#Xshell 全屏的方法:ALT+回车)
- 清屏:使用clear;
- std:stoi函数是将字符串转化为整形的函数;
- 类模板和函数模板;:函数模板可以实例化;而类模板不可实例化;
- 越界编译不会报错;
- 无参构造函数创建对象时;不要写()直接创建对象即可;
- 默认模板实参:
- 内存池和内存适配器区别
- 含有模板的函数指针编译器不被允许的;
- 函数指针不可作为模板参数
- 仿函数可以作为模板参数
- 另外函数指针不可用来存储数据;但是仿函数可以实现数据的存储(原因:本质是一个对象,可以用来存储数据)
- 类名字的首字母要大写
- 函数模板的调用有两种方法:
- 算法库内存在堆的库函数:
- 类的定义和声明;
- 模板的定义和声明不可以分离编译
- 显示示例化
- 之前保护和私有一样;
- 右值和左值的区别:
- [C++ 中的const自定义类型的变量可以使用非const的成员函数;(这是C++流下的一个大坑)](#C++ 中的const自定义类型的变量可以使用非const的成员函数;(这是C++流下的一个大坑))
- const和*和&同时出现:
- [二叉树 子节点和父节点的关系](#二叉树 子节点和父节点的关系)
- [迭代器就是指针的的get函数(get函数的返回值是具有常性)返回值可以被赋值;](#迭代器就是指针的的get函数(get函数的返回值是具有常性)返回值可以被赋值;)
- 反向迭代器的旧版和新版之间的区别
计算长度使用左闭右开的方法
getline(解决输入空格问题和给一个输入的界限)
这个函数,只有遇到换行时,才会停止;
定义:
示例:
空格问题
输入界限问题;
stoi(字符串转整形)
stoi(整型转字符串型)
reverse(反转函数)将字符串立志
静成员变量在类外初始化;但是有特例:const static int类型可以在类内初始化;而const static char类型不能在类内实现初始化;
一般的string类型中的capacity不包含'\0'
类的初始化是顺序是和声明的顺序相同的;
范围for函数;如果 在函数体内改变数组使用auto定义的变量;进行改变数组不会改变;
范围for就是刻板的拷贝
将for(auto e:s1)替换位的for(e=s1.begin;e<s1.end;e++)
这里的迭代器是固定的;所以使用时将迭代升器改变名字将无法实先for循环;
std内的容器的头文件的使用
这里的string类内函数不需要使用头文件;
正常情况下std命名空间内的容器都需要使用头文件;但是这里的string是特例不需要使用头文件就可以使用;
clear()
堆和栈的生长方向
堆向上生长;
栈向下生长;
对于栈来讲,生长方向是向下的,也就是向着内存地址减小的方向;对于堆来讲,它的生长方向是向上的,是向着内存地址增加的方向增长
栈和堆的动态空间建立和释放
堆是使用malloc()、calloc()、realloc()等函数动态分配的,而使用alloca()函数可以动态分配栈的内存空间,释放的时候由编译器自己释放。
3.new与malloc的属性区别
new是关键字,需要编译器支持;malloc是库函数,需要头文件支持。
4.类模板
参数类型强转
迭代器在g++环境下是指针;在其他条件下比一定是指针;(迭代器初始化多使用auto来定义)
迭代器可以使用加法运算;±数字都可;
除了string类定义了流插入和流提取;其他类都没有定义;原因:其他类都额可以使用范围for等循环来实现;string因为有字符串所以必需要定义一个;
异或知识点:将其第一操作数的每个位与其第二操作数的相应位进行比较。 如果其中一个操作数中的位为 0,而另一个操作数中的位为 1,则相应的结果位设置为 1。 否则,将对应的结果位设置为 0。
当想只是使用类内的函数时;创建匿名对象;
防止被重命名函数
这里解决的是一个文件中已经有头文件;而第三个文件同时包含了这两个文件的问题;
0和另一个数异或的结果是这一个数;
stl中的cbegin()没什么用;原因:begin()这里有const的版本重命名函数
扩容的写法:
先将capacity变到想要括的大小;再使用new来将物理上的内存扩到这个大小;再将原来的内容拷贝过去;
这里可以将其写成一个reserve函数如果没有就写4;有就扩容二倍;
size_type就是size_t;
匿名对象具有常性;
即匿名对象不能修改;
匿名对象赋值普通对象,将会将和并拷贝构造和构造变为构造;
匿名对象赋值引用对象;引用对象需要使用const类型:原因:匿名对象就有常性;
但是两者的时间和作用域都会改变;
拷贝构造函数和 构造函数的隐式转换
默认构造函数
c++将其进行了升级;使内置类型和自定义类型都有了构造函数
内置类型的构造函数和自定义类型相同都是使用的类型加括号的方法:
int +名字+()------》这里的()里加参数;
注意从后向前循环时间使用一个变量大于等于0时间;使用size_t类型会出错;需要使用强制类型转换将类型转位int类型;
vector的insert插入时使用头插不需要强制类型转换原因: 这里使用的是地址;地址不会为0;
new创建的数组如果太大就会抛异常
new函数在不同的编译器失败的操作不同:
相对老的编译返回空指针;
较新的编译器会抛异常;
抛异常
使用try catch语句;
迭代器类型的组成:
typedef会受到访问限定符的限制;
直接放在类中是私有的不能使用;需要放在共有的中;
内置类型也有默认构造函数
int类型的默认初始化是将其赋值为0;
string类型默认初始化是将其赋值为空;
vector类型容器扩容后迭代器将无法使用;
解决方法:
记录长度;将新start+长度记新的迭代器
算法库的头文件:
当一个类里面全部都是使用的是共有;就不使用class而是使用struct;
类内函数不必按照使用顺序来进行定义;
const迭代器:
list 的->的实现
函数内出现模板类去调用内嵌类型或静态成员变量;
这里的添加typename是为了是为了让编译器在第一次检查每个函数时,勉强通过;再在示例化(函数被调用),再进行编译;
该函数可以使用传参数来进行实例化;
将容器定义为模板,让编译器来识别是哪个容器;来进行函数操作
各容器的定义的解读
当使用该定义来定义变量时:使用的是名字+<容器内部的数据类型>
如:vector
linux的指令大部分改变的是文件的属性;
文件内存包含:1.数据2.属性;
Linux的隐藏文件是以.来领先的;
linux指令:
pwd 显示目录;
ls ---(查找)可以查找当前文件也可以查找其他文件;(这里不会改变当前所在位置;
ls-l 显示当前的详细文件内容------简写------》ll;这里的l是lot
mkdir ---创建一个文件夹
cd---是双击的意思;这里配套相对路径或绝对路径
touch ---创建文件;
ls-a 显示隐藏的文件;(Linux中将隐藏文件的名字设置以.开头;
一个文件内都包含两个隐藏文件 :一个是"."的文件;另一个"..."的文件
**"."是当前文件的按键;"..."是上一个文件建的按键;
cd. ------------------------实现的是还在当前目录;
cd... ------------------------实现的是返回到上一目录;
使用:
"."在当前文件夹中实现一个程序的运行时;使用如下:
./文件名
相对路径:
./当前文件文档
.../上一文件夹中的另一个文件夹/该文件的文件或文档;
.../bin/a.txt
指令是在linux系统下用c语言写可执行程序;而这些程序都包含在
/usr/bin目录下
** cd- ------------------------返回上一个浏览的目录
which ------------查找该文件名字的地址;使用:which +" "+文件名;
alias ---------重命名文件名; 使用:alias+"新名字"+"="+" '原名字 ' "
Linux中查找文件使用路径来进行查找 ;
路径:
根目录:
路径分割符号:
该路径是多叉树结构;
Linux用户: root和其他用户;
家目录:这里和根目录不同,是/+家目录(如root)
** touch创建普通文件;如:test.c |test.file|test.txt
** stat 查看文档的详细性质;如时间 ,大小,地址;
** 属性内的时间**:
access 时间这个时间是创立时间;
modify 时间这个时间是内容的最近更改时间
charge时间这个时间是性质更改时间;
touch 的使用该文件的时间将被更改;
** -p直接创建多个文件(文件夹套文件夹)
** tree 使用树状结构来排列该文件夹的文件;
** rmdir** 删除空目录
** rm** 删除文档 (这个会弹出是否删除)
![在这里插入图片描述](https://img-blog.csdnimg.cn/4a73b9f4906540e2a03b8e0d3c1d9b20.png)
** rm-f** 强制删除;
** rm-r** 递归删除整个文建的内容;
** rm-fm强制删除整个文件的内容;
这个就linux的文件将全部删除;
8.man指令(字典) :
./*删除当前目录下的所有文件;
** cp拷贝
cp-r 将整个目录拷贝
** cp-r-f 强制整个拷贝
将整个目录的拷贝到t中;
** cat**查看普通文件的内容(。c文件)
** mv**
Xshell 全屏的方法:ALT+回车
清屏:使用clear;
- List item
std:stoi函数是将字符串转化为整形的函数;
类模板和函数模板;:函数模板可以实例化;而类模板不可实例化;
越界编译不会报错;
无参构造函数创建对象时;不要写()直接创建对象即可;
默认模板实参:
和函数的默认实参相同;
cpp
template <typename T = int> class A;
内存池和内存适配器区别
allocator内存池container内存适配器
c++添加的构造函数 :
initializer list构造函数
含有模板的函数指针编译器不被允许的;
所以函数指针相较于反函数差;
函数指针不可作为模板参数
仿函数可以作为模板参数
另外函数指针不可用来存储数据;但是仿函数可以实现数据的存储(原因:本质是一个对象,可以用来存储数据)
类名字的首字母要大写
函数模板的调用有两种方法:
方法一:显示调用:使用<>将要传送的传过去;
方法二:自动推导
算法库内存在堆的库函数:
类的定义和声明;
类可以定义和声明分离;这里类的声明必须在类内存在;
模板的定义和声明不可以分离编译
原因:.h文件和.cpp文件进行运行函数没有实例化;还是模板(参数没有示例化)函数没有被分配内存;
这就导致函数调用时找不到函数地址;
解决:在cpp文件中进行实例化
在.h实现函数定义;(声明和定义放在一起
显示示例化
template+ 返回值+函数名+<类型>+(参数)template+即函数定义
函数模板的实例化
类模板的实例化
之前保护和私有一样;
继承以后;保护就有了意义
右值和左值的区别:
右值:是不可以取地址和别名的值;如变量名、解引用以后的指针;这里只可以使用const变量来进行取别名和指针;
左值:是可以取地址和别名的值;如字面常量、表达式返回值、函数返回值等
C++ 中的const自定义类型的变量可以使用非const的成员函数;(这是C++流下的一个大坑)
示例:
这里的end()返回的变量是临时对象;具有常性;所以在rbegin()中不可以将其进行--;
const和*和&同时出现:
const的指针的引用
二叉树 子节点和父节点的关系
迭代器就是指针的的get函数(get函数的返回值是具有常性)返回值可以被赋值;
反向迭代器的旧版和新版之间的区别
区别于*和->的重定义;和迭代器begin() end() rebegin() reend()这几个函数的定义;
旧版:
新版