C++基础入门
文章目录
- 前言
- 一、C++历史及发展
- 1.C++是什么
- 2.C++历史
- 二、开始C++
- 1.基础类型
- 1.第一个简单的C++程序
- 2.命名空间
- 1.命名空间的介绍
- 2.命名空间的使用
- 3.命名空间的using声明与using指示
- 3.初识输入输出操作
- 4.引用
- 1.引用概念
- 2.引用的使用
- 1.引用做参数
- 2.引用做返回值
- 3.引用和指针的区别
- 4.const的引用
- 5.auto关键字
- 1.auto简介
- 2.复合类型,常量和auto
- 1.auto与指针和引用结合使用
- 2.语句
- 1.范围for
- 3.函数
- 1.缺省参数的函数
- 1.缺省参数的概念
- 2.缺省参数的分类
- 1.全缺省参数
- 2.半缺省参数
- 2.函数的重载
- 1.函数重载的概念
- 2.调用重载的函数
- 3.内敛函数
- 4.其他
- 1.nullptr
前言
C++是在C的基础之上,容纳进去了面向对象编程思想,并且增加了许多有用的库。熟悉C语言对C++学习有很大的帮助,C++是对C语言的补充和对C语言进行优化。本章我们学习一点C++的基础内容,先浅浅的了解一下C++。
一、C++历史及发展
了解一门语言,我们要先看一下它的发展历史和出现的原因,方便我们更好的了解语言适合解决什么样的问题。
1.C++是什么
在20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,为了解决C语言对于复杂的问题,规模较大的程序,需要高度的抽象和建模时的困境。
在1982年,Bjarne Stroustrup(本贾尼)博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的语言。为了表达该语言与C语言的关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。
2.C++历史
1979年,贝尔实验室的Bjarne Stroustrup(本贾尼)等人试图分析unix内核的时候,试图将内核模块化,于是在C语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with classes。现在公司主流使用还是C++98和C++11。
二、开始C++
1.基础类型
1.第一个简单的C++程序
#include<iostream>
using namespace std;
int main()
{int a = 0;int b = 0;//从键盘上获得值,相当于C语言的scanf函数cin >> a >> b;//把结果输出到屏幕,相当于C语言的printf函数cout << a + b << endl;return 0;
}
相信大部分课本的代码案例都是如此。让我们看一下运行的结果吧.
这个简单的小程序就实现了,但是在C++Primer中是下面的写法:
#include<iostream>
int main()
{int a = 0;int b = 0;std::cin >> a >> b;std::cout << a + b << std::endl;return 0;
}
结果和上面一模一样,那么上面的using namespace std和std::分别是什么呢?为什么可以有两种写法呢?
2.命名空间
针对上面的问题,我们来介绍一下C++中的命名空间。
1.命名空间的介绍
因为变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
对比上面的代码我们可以看出使用了未加using namespace std在实现代码中多了一些东西,这是因为我们用到的库函数基本都属于命名空间std,例如std::cin表示标准输入中获取内容。此处使用的是作用域操作符(::),意思是编译器应该从操作符左侧的作用域来寻找右侧的名字。因此std::cin的意思是使用命名空间std的名字cin
2.命名空间的使用
当我们多个文件使用的全局变量,函数或者结构体使用的名字相同时,这时间就会产生命名冲突,在C语言中是没半法很好的解决这些问题的。如:
那么在C++中如何解决这些问题的呢,我们引入了命名空间这个概念。
namespace关键字,后面跟命名空间的名字,然后加一对{},{}中即为命名空间的成员。
加入我们的命名空间就可以解决这样的问题了命名空间也是可以嵌套的。
3.命名空间的using声明与using指示
我们先看什么是using声明与using指示
区别:
一条using声明语句一次只引入命名空间的一个成员,它使得我们很清楚地知道程序中所用的到底是哪个名字。一条using声明语句可以出现在全局作用域,局部作用域,命名空间作用域以及类的作用域,在类的作用域中,这样的声明语句只能指向基类成员。
using指示中,我们无法控制哪些名字是可见的,因为所有名字都是可见的。且using指示不可以出现在类中。
在using指示中,以关键字using开始,后面跟namespace关键字以及命名空间的名字,如果这里的名字不是已经定义好的命名空间名字,程序将会发生错误。
命名空间只会影响使用,不会影响生命周期。
更加详细的可以看C++Primer。
3.初识输入输出操作
C++并未定义任何输入输出(IO)语句,而是包含了一个全面的标准库来提供IO机制。我们输入输出使用了iostream库,iostream库包含两个基础类型istream和ostream,分别表示输入流和输出流
标准库定义了4个IO对象,为了处理输入,我们使用了一个cin的istream类型的对象,这个对象也被称为标准输入。对于输出,我们使用了一个cou的ostream类型的对象,此对象也被称为标准输出。标准库还定义了其他两个ostream对象,分别为cerr和clog,我们一般用cerr来输出警告和错误信息,因此cerr也叫标准错误。而clog用来输出程序运行时的一般性信息。
#include<iostream>
using namespace std;
int main()
{int a = 0;int b = 0;cin >> a >> b;//标准输入cout << a + b <<endl;//标准输出return 0;
}
上面一个简单的相加程序就用到了们标准输入和标准输出。
<<(输出运算符):<<运算符接受两个运算对象:左侧的运算对象必须是一个ostream对象,右侧的对象是要打印的值。此运算符将给定的值写入到给定的ostream对象中。
>>(输入运算符):>>与输出运算符相似,它接受一个istream作为其左侧运算对象,接收一个对象作为右侧运算对象。此运算符将给定的值写入到给定的ostream对象中。
cin >> a;cin >> b;cin >> a >> b;//效果和上面等价cout << a ;cout << b ;cout << a << b;//效果和上面等价
4.引用
1.引用概念
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
int main()
{//类型& 引用变量名(对象名) = 引用实体int a = 10;int& sa = a;//sa指向a(是a的另一个名字)int& saa;//报错:引用必须被初始话return 0;
}
定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用,一旦初始话完成,引用将和它的初始值对象一直绑定在一起。因为无法更改绑定对象,所以引用必须初始化!!!
int main()
{int a = 10;int& sa = a;a++;//对a进行++cout <<"sa = " << sa << endl;//sa的值也会随着发生改变sa++;//对sa进行++cout <<" a = " << a << endl;//a的值也会随着发生改变return 0;
}
下面我们看一些引用的例子:
int main()
{int val = 10;int rval1 = val;//把val的值赋给rval1int &rval2 = val;//rval2是val的引用int& rval3 = rval2;//rval3是rval2的引用,此时也是val的引用int& rval4 = 10;//错误:引用类型的初始值必须是一个对象double& rval5 = val;//错误:此处引用的初始值类型必须为double类型return 0;
}
在引用中,引用只能绑定在对象中,而不能与字面值或某个表达式的计算结果绑定到一起。但也有例外情况。原因也会在下面演示。
2.引用的使用
1.引用做参数
void Swap(int* a, int* b)//指针类型接收参数
{int tmp = *a;*a = *b;*b = tmp;
}
void SWAP(int &sa, int &sb)//引用类型接收参数,此时的sa就是main函数中的a,sb是main函数中的b
{int tmp = sa;sa = sb;sb = tmp;
}
int main()
{int a = 10;int b = 20;Swap(&a, &b);//指针类型的传参printf("a = %d b = %d\n", a, b);SWAP(a, b);//引用类型传参printf("a = %d b = %d\n", a, b);return 0;
}
2.引用做返回值
int& ADD(int a, int b)
{static int c = 0;c = a + b;return c;
}
int& add(int a, int b)
{int c = 0;c = a + b;return c;
}
int main()
{int a = 10;int b = 20;int& c1 = ADD(a, b);cout << c1 << endl;cout << "ADD(a, b) val is:" << c1 << endl;int& c2 = add(a, b);cout << c2 << endl;cout <<"add(a, b) val is:" << c2 << endl;return 0;
}
上面的代码有什么结果呢?
对比可以发现,当引用做返回值时如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。因为函数调用创建栈帧会使用该片空间。
3.引用和指针的区别
int main()
{int val = 10;int vbl = 20;int &rval = val;//rval是val的引用int* pa = &val;//pa是指向val的指针(*pa)++;cout << val << endl;rval++;cout << val << endl;pa = &vbl;//pa现在指向vblreturn 0;
}
运行结果:
观察汇编代码:
我们发现引用的汇编指令和指针的汇编指令相同,引用的底层逻辑就是指针。
引用和指针的区别:
- 引用概念上定义一个变量的别名,指针存储一个变量地址
- 引用在定义时必须初始化,引用不可以为NULL指针可以为NULL
- 引用初始化后就不可以更改,而指针随时更改指向对象。
- 在sizeof中引用结果为引用类型的大小,但指针始终是地址空间所占字节个数。
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。
- 有多级指针,但是没有多级引用。
- 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
- 引用比指针使用起来相对更安全。
4.const的引用
我们可以把引用绑定到const对象上,就像绑定到其他的对象上一样,我们称之为对常量的引用,与普通引用不同的是,对常量的的引用不能被作用修改它所绑定的对象。
int main()
{const int a = 10;const int& ra1 = a;//引用及其对象都是常量int& ra1 = a;//错误,试图让一个非常量引用指向一个常量对象
}
在我们上面看到的引用类型必须与其所引用的对象类型一致,但有两个例外:
一是在初始化常量引用时允许任意表达式作为初始值,只要该表达式的结果可以转化为引用类型即可,尤其允许为一个常量引用绑定非常量的对象,字面值,甚至是一个表达式。
int main()
{int a = 10;const int& sa1 = a;//允许将const int& 绑定到一个普通int对象上const int& sa2 = 10;//sa2是常量引用,因为sa2不可以改变,所以可以绑定到常量上const int& sa3 = sa1 * 2;//sa3是常量引用int &sa4 = sa1 * 2;//sa4是一个普通引用,不可以绑定到常量上return 0;
}
我们下面来看由duoble绑定int类型为什么不可以
int main()
{double val = 3.14;const int& sval1 = val;//正确int& sval2 = val;//错误return 0;
}
我们来分析一下原因:
类型转化都会产生临时变量,临时变量具有常属性,所以这也是为什么上面的绑定不成功的原因,我们需要用常引用来进行绑定。
5.auto关键字
1.auto简介
在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,于是C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。显然,auto定义的变量必须有初始值。
int Testauto()
{return 0;
}
int main()
{int a = 10;auto b = a;auto c = 'a';auto d = Testauto();cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;return 0;
}
2.复合类型,常量和auto
编译器推断出来的auto类型有时间和初始值的类型并不完全一样,编译器会适当的改变结果类型使其更符合初始化规则
1.auto与指针和引用结合使用
使用引用其实就是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的其实是引用对象的值
int main()
{int a = 10;int& b = a;auto c = b;cout << typeid(c).name() << endl;return 0;
}
int main()
{int x = 10;auto a = &x;auto* b = &x;auto& c = x;cout << typeid(a).name() << endl;cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;return 0;
}
从上面我们可以看出用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&
要在一条语句中定义多个变量(*和&只从属于某个声明符,而非基本数据类型的一部分),初始值必须是同一类型。
int main()
{auto a = 1, b = 2;auto c = 1, d = 2.0;// 该行代码会编译失败,因为c和d的初始化表达式类型不同return 0;
}
注意:auto不能作为函数的参数, auto也不可直接声明数组。
2.语句
1.范围for
对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因
此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
//语法形式
for (declaration : expression)
{statement;
}
expression:表示的必须是一个序列,如数组,vector或者string类型等类型的对象,这些类型的共同特点就是拥有能返回迭代器的begin和end成员(后面会提迭代器)
declaration:定义一个变量,序列中的每个元素都可以转换为该变量的类型。确保这些类型的最简单办法就是使用auto。
statement:循环语句。
int main()
{int tmp[] = { 1,2,3,4,5,6,7,8,9 };for (auto i : tmp){cout << i << " ";}return 0;
}
这就是一个简单范围for
思考一下下面的代码中数组的内容会不会改变呢?
int main()
{int tmp[] = { 1,2,3,4,5,6,7,8,9 };for (auto i : tmp){i *= 2;cout << i << " ";}cout << endl;for (auto i : tmp){cout << i << " ";}return 0;
}
对比发现,我们对定义变量的改变并不会影响我们数组的内容。因为我们对定义的变量是对序列中元素的拷贝。对变量的改动并不会影响我们序列中的元素。
我们再来看下面的代码:
int main()
{int tmp[] = { 1,2,3,4,5,6,7,8,9 };for (auto i : tmp){i *= 2;cout << i << " ";}cout << endl;for (auto i : tmp){cout << i << " ";}return 0;
}
此时我们对变量的更改影响了我们数组中的元素,因为我们第一次范围for中的定义的变量为引用,它是序列元素的别名,对这个变量的改变就相当于对数组内容的改变。
判断下面的代码是否是正确的呢?
void Testfor(int tmp[])
{for (auto& i : tmp){cout << i << " ";}
}
int main()
{int tmp[] = { 1,2,3,4,5,6,7,8,9 };return 0;
}
答案是不正确的,范围for循环迭代的范围必须是确定的,对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。
我们看到编译器也允许这样使用,在上面代码中数组传参,退化为了指针,此时用范围for找不begin和end的位置。
3.函数
1.缺省参数的函数
1.缺省参数的概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
如:
void Cout(int a = 0)
{cout << a << endl;
}
int main()
{int a = 10;Cout();Cout(a);return 0;
}
当我们没有像这个函数传入参数时,函数使用的默认值0,当我们传入参数时,函数使用我们所传递的参数。
2.缺省参数的分类
1.全缺省参数
void Cout(int a = 1, int b = 2, int c = 3)
{cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;cout << endl;
}
上面这个就是全缺省参数的函数,所有的形参都有默认值。
下面我们来测试一下函数:
int main()
{int a = 10;int b = 20;int c = 30;Cout();Cout(a);Cout(a,b);Cout(a,b,c);Cout(c);return 0;
}
我们可以发现当我们传入的参数小于所需的个数时,形参会从左向右依次接收。
2.半缺省参数
void Cout(int a, int b = 2, int c = 3)
{cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;cout << endl;
}
此时这个函数就是半缺省参数。
注意:半缺省参数必须从右往左依次来给出,不能间隔着给,且缺省参数不能在函数声明和定义中同时出现。一旦某个形参被赋予了默认值,那么他后面的所有形参都必须有默认值。
2.函数的重载
C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类顺序)不同。常用来处理实现功能类似数据类型不同的问题。
1.函数重载的概念
在同一作用域内的几个函数名字完全相同但形参列表不同,我们称之为重载函数
int Add(int a, int b)
{return a + b;
}
double Add(double a, double b)
{return a + b;
}
int Add(int a, double b)
{return a + b;
}
int main()
{int a = 10, b = 20;double c = 10.125, d = 20.25;cout << Add(a, b) << endl;cout << Add(c, d) << endl;return 0;
}
如上述代码中的Add就构成了重载
构成函数的重载必须是函数参数不相同(如个数,类型等)
2.调用重载的函数
当我们定义了一组重载函数后,我们需要合理的实参来调用他们,函数匹配是一个过程,函数匹配也叫重载确定,用编译器决定调用哪一个函数。
此时有三种情况:
1.编译器找到一个与实参最佳辟匹配的函数,并生成调用该函数。
2.找不到任何一个函数与调用的实参相匹配,此时编译器发出无匹配的错误信息。
3.有多于一个函数可以进行匹配,但每个都不是最佳选择,此时也发生错误,称为二义性调用。
如上图(出自《程序员的自我修养》p89),是vs对函数重载在编译器的名称。
3.内敛函数
我们可以将函数指定为内敛函数(inline),编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
inline int Add(int a, int b)
{return a + b;
}
int main()
{int a = 10, b = 20;int c = Add(a, b);return 0;
}
上面在编译过程展开类似下面的形式:
int c = a + b;//直接对函数进行展开
内敛说明只是向编译器发送一个请求,编译器可以忽略这个请求。
一般来说,内敛机制用于优化规模小,流程直接,调用频繁的函数,很多编译器都不支持内敛递归函数。
nline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。
4.其他
1.nullptr
nullptr是一种特殊类型的字面值。
在过去的程序中用的名为NULL的预处理变量来给指针赋值,这个变量在头文件cstdilb中定义,它的值为0,因此使用NULL初始化指针和用0初始化指针是一样的。在C++中最好使用nullptr,同时尽量避免使用NULL。
void f(int)
{cout << "f(int)" << endl;
}
void f(int*)
{cout << "f(int*)" << endl;
}
int main()
{f(0);f(NULL);return 0;
}
我们可以发现当我们传NULL时并没有走指针的函数,所以当我们传指针类型时,避免使用NULL
相关文章:
C++基础入门
文章目录 前言一、C历史及发展1.C是什么2.C历史 二、开始C1.基础类型1.第一个简单的C程序2.命名空间1.命名空间的介绍2.命名空间的使用3.命名空间的using声明与using指示 3.初识输入输出操作4.引用1.引用概念2.引用的使用1.引用做参数2.引用做返回值 3.引用和指针的区别4.const…...
【每日随笔】驾驭人性 ② ( 员工立场问题 | 立场转变 | 吴越同舟 | 老板如何与员工结成利益共同体 )
文章目录 一、员工立场问题二、立场转变三、吴越同舟四、老板如何与员工结成利益共同体 一、员工立场问题 人的潜力是很大的 , 肩上抗 100 斤 水泥 和 肩上抗 100 斤黄金 , 能一样吗 , 扛着黄金绝对能扛回家 ; 员工 不愿意 与公司一条心是正常的 , 员工 拿的是 死工资 , 公司赚…...
C++(QT)画图行车
通过鼠标在窗口上点击形成多个点的连线,绘制一辆汽车沿着绘制的连线轨迹前进。要求连线点数大于20.可以通过清除按钮清除已经绘制的连线,并可以重新绘制一条轨迹连线。当车辆行驶到轨迹终点时,自动停止。(汽车实在可用方块代替&am…...
Unity中Shader抓取屏幕并实现扭曲效果(优化)
文章目录 前言一、在之前顶点着色器的输入中,放弃了使用结构体传入,而是直接从应用程序阶段传入参数,这样写的话,对于程序来说,不方便扩张,所以需要对其进行修改实现1、定义结构体用于传入顶点坐标系2、因为…...
肖sir__设计测试用例方法之_(白盒测试)
白盒测试技术 一、定义: 白盒测试也叫透明盒测试,检查程序内部结构及路径一是否符合规格说明,二是否符合其代码规范。 因此,也叫结构测试或者逻辑驱动测试。 二、白盒测试常见方法: a、语句覆盖; b、判断覆…...
GoT:用大语言模型解决复杂的问题
GoT:用大语言模型解决复杂的问题 摘要介绍背景和符号表示语言模型和上下文学习Input-Output(IO)Chain of thought(CoT)Multiple CoTTree of thoughts(ToT) GoT框架推理过程思维变换聚合变换&…...
nginx服务和uwsgi服务如何设置开机自启动
上次学到了在云服务器下如何部署Django项目,用到了nginx服务和uwsgi服务,需要手工启动这2个服务的命令。 现在考虑如何设置开机自启动,为什么要这样考虑?因为服务器万一出问题,意外重启了,那我们部署的Dja…...
算法-分治算法
文章来源: https://blog.csdn.net/weixin_45630258/article/details/126425400 欢迎各位大佬指点、三连 一、分治 1、定义:分治,也就是分而治之。 它的一般步骤是: ① 将原问题分解成若干个规模较小的子问题(子问题…...
react 实现监听逻辑
需求: 在一个页面下有多个子tab在某些tab 下,或者父节点的数据更新的时候,其他子tab 或者父节点也要同步更新 进程: 正常情况下会把所有用到的数据都移动到父节点,修改行为也都放在父节点但如果这样的话父节点的数据…...
vue项目一个页面包含多个时间选择器的处理方案
描述:vue项目中如果在一个页面使用多个时间选择器组件时,不同的时间选择器需要分别分开工作 解决方案一 原本是想直接每一个时间选择器都安排一套相对独立的维生系统,但是到后面发现繁琐至极,而且报错,果断放弃&#…...
机器学习入门教学——决策树
1、简介 决策树算法是一种归纳分类算法,它通过对训练集的学习,挖掘出有用的规则,用于对新数据进行预测。决策树算法属于监督学习方法。决策树归纳的基本算法是贪心算法,自顶向下来构建决策树。 贪心算法:在每一步选择…...
文献阅读:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
文献阅读:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 1. 文章简介2. 具体方法3. 实验结果 1. 数学推理 1. 实验设计2. 实验结果3. 消解实验4. 鲁棒性考察 2. 常识推理 1. 实验设计2. 实验结果 3. 符号推理 1. 实验设计2. 实验结果 4.…...
从零开发一款ChatGPT VSCode插件
本文作者是360奇舞团开发工程师 引言 OpenAI发布了ChatGPT,就像是给平静许久的互联网湖面上扔了一颗重磅炸弹,刹那间所有人都在追捧学习它。究其原因,它其实是一款真正意义上的人工智能对话机器人。它使用了深度学习技术,通过大…...
go基础09-Go语言的字符串类型
字符串类型是现代编程语言中最常使用的数据类型之一。在Go语言的先祖之一C语言当中,字符串类型并没有被显式定义,而是以字符串字面值常量或以’\0’结尾的字符类型(char)数组来呈现的: #define GOAUTHERS "Rober…...
【C++模拟实现】手撕AVL树
【C模拟实现】手撕AVL树 目录 【C模拟实现】手撕AVL树AVL树的介绍(百度百科)AVL树insert函数的实现代码验证是否为AVL树AVL树模拟实现的要点易忘点AVL树的旋转思路 作者:爱写代码的刚子 时间:2023.9.10 前言:本篇博客将…...
如何重置 docker中的mariadb的root
停止 Mariadb 容器:运行以下命令停止正在运行的 Mariadb 容器: docker stop <container_name>将 <container_name> 替换为你的 Mariadb 容器的名称或容器ID。 删除 Mariadb 容器:运行以下命令删除已停止的 Mariadb 容器&#x…...
设计模式系列-原型模式
一、上篇回顾 上篇创建者模式中,我们主要讲述了创建者的几类实现方案,和创建者模式的应用的场景和特点,创建者模式适合创建复杂的对象,并且这些对象的每 个组成部分的详细创建步骤可以是动态的变化的,但是每个对象的组…...
家用电脑可以用做服务器吗
家用电脑的结构与服务器的结构是相同的,家用电脑是可以用来搭建服务器使用。但使用家用电脑做服务器在稳定性会比服务器差很多 1.家用电脑没有公网IP,网络运营商分配的IP重启路由之后是会变化,不固定。服务器运行是需要有固定IP让人连接访问。…...
CRM软件管理系统的基本功能
CRM管理系统是企业运营的重要工具,它可以帮助企业管理客户关系,提升销售效率,大幅提高客户转化率,实现业绩增长。那么,CRM管理系统一般包含哪些功能呢?下面我们就来说说。 1、销售自动化 销售自动化顾名思…...
手机喊话应用实现思路
手机要是动一下,就喊话“摇摇零线,摇摇零线”,是不是比较酷, 这里实现一下手机翻转一下,播放声音的效果, 通过sensor识别到手机的运动状况,然后播放音频, public class MainActivi…...
【ARM CoreLink 系列 3 -- CCI-550 控制器介绍 】
文章目录 CCI FamilyCCI-550 简介CCI-550 功能CCI-550 Interfaces Snoop filter 使用背景CCI-550 Snoop filter 上篇文章:ARM CoreLink 系列 2 – CCI-400 控制器简介 CCI Family CCI-550 简介 Arm CoreLink CCI-550 Cache Coherent Interconnect 扩展了 CoreLink…...
最长递增子序列 -- 动规
300. 最长递增子序列 注意「⼦序列」和「⼦串」的区别,⼦串⼀定是连续的,⽽⼦序列不⼀定是连续的。 class LengthOfLIS:"""300. 最长递增子序列https://leetcode.cn/problems/longest-increasing-subsequence/description/""&q…...
linux 进程管理命令
进程管理命令 查看进程命令 ps命令 显示系统上运行的进程列表 # 查看系统中所有正在运行的系统ps aux# 获取占用内存资源最多的10个进程,可以使用如下命令组合:ps aux|head -1;ps aux|grep -v PID|sort -rn -k 4|head# 获取占用CPU资源最多的10个进程&am…...
第一章:计算机网络和因特网
什么是因特网 具体构成描述 互联网是一个世界范围的计算机网络,即一个互联了遍及世界数十亿计算机设备的网络,这些被连接的设备被称为主机或者端系统。端系统通过通信链路(communication link)和分组交换机(packet s…...
Android后退堆栈
修改代码 现在的ItemClick使得用户单击其中一个项目时就会跳转,现在要修改其使得在一个小屏幕设备上才会这样做,在一个大屏幕设备上运行用户选择一个训练项目时在右边的片段显示响应的信息。 希望片段处理后退的方式:假设用户在手机上运行这…...
网络原理(一)网络基础,包括IP ,网络相关的定义
网络基础,包括IP ,网络相关的定义 网络基础冲突域广播域DNSNATNAPT 网络基础 以下图片是书上的网图。 什么是IP地址? IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。P地址是…...
Python语义分割与街景识别(2):环境搭建
前言 本文主要用于记录我在使用python做图像识别语义分割训练集的过程,由于在这一过程中踩坑排除BUG过多,因此也希望想做这部分内容的同学们可以少走些弯路。 本文是python语义分割与街景识别的第二篇,关于环境搭建的内容。这个部分是整个流…...
stm32(GD32,apm32),开优化后需要特别注意的地方
提到优化就不得不提及 volatile 使用场景 1:中断服务程序中修改的供其它程序检测的变量,需要加volatile; : 2:多任务环境下各任务间共享的标志,应该加volatile; 3:并行设备的硬件寄存器&#x…...
LLVM 与代码混淆技术
项目源码 什么是 LLVM LLVM 计划启动于2000年,开始由美国 UIUC 大学的 Chris Lattner 博士主持开展,后来 Apple 也加入其中。最初的目的是开发一套提供中间代码和编译基础设施的虚拟系统。 LLVM 命名最早源自于底层虚拟机(Low Level Virtu…...
R语言---使用runway进行机器学习模型性能的比较
R语言—使用runway进行机器学习模型性能的比较 #dataloadrm(list=ls())#librarylibrary(dcurves)library(gtsummary)library(tidyverse)library(mlr3verse)library(tidyverse)library(data.table)</...
没有网站可以做落地页/怎样免费制作网页
定义了一下方法,具体用法可查百度usleep() 函数延迟代码执行若干微秒。unpack() 函数从二进制字符串对数据进行解包。uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。time_sleep_until() 函数延迟代码执行直到指定的时间。time_nanosleep() 函…...
衡阳市建设协会网站/100个免费推广网站
在SQL Server 2005/2008中的当前数据库中遍历所有表显示所有表的行数 SQL Server DECLARE CountTableRecords CURSOR READ_ONLY FOR SELECT sst.name, Schema_name(sst.schema_id) FROM sys.tables sst WHERE sst.TYPE U DECLARE name VARCHAR(80), sche在SQL Server 2005/200…...
郑州红酒网站建设/windows优化大师要会员
字典是Tcl数据结构之一,用于映射键到值。 创建 dict set dictname key value dict create key1 value1 key2 value2 .. keyn valueN 第一种方式通过dict set命令定义名为dictname的字典,同时添加且只能添加一组数据。 第二种方式通过dict create命令…...
还有哪些媲美wordpress框架/搜索引擎搜索
嗨,欢迎大家收看火焰带来的游戏流程解说重装上阵啊,好吧我们开始吧,嗯还是啥的吗前往活动不前往好吧,这个车库咱们来个呃新模式是吧单人奇观创造吗?不是我还得学习呢,这个是我的吗?匹配好的我看…...
欧美做同志网站有哪些/现在最火的发帖平台
文章来自:http://hi.baidu.com/leo10086/item/37e528dd6e4d3d19d68ed03d 把经纬度转换成十进制的方法很简单 如下就可以了 Decimal Degrees Degrees minutes/60 seconds/3600例:575556.6" 5755/6056.6/360057.93238888888881146524.6"1…...
帮人做传销网站违法吗/seo需要懂代码吗
代谢与脂质组学平台服务项目:三羧酸循环通路分析/糖酵解/磷酸戊糖途径分析/脱氧核苷、核苷分析/ CoA 及相关代谢产物/嘌呤代谢产物分析/游离氨基酸分析/游离脂肪酸分析生物样品¥300 /针(每一类)代谢流(Flux)分析/靶标性代谢组学/非靶向代谢组学/非靶向脂…...