当前位置: 首页 > news >正文

【c++基础】

C++基础入门

  • 统一初始化
  • 输入输出
    • 输入输出符
    • 输入字符串
  • const与指针
    • c和c++中const的区别
    • const与指针的关系
    • 常变量与指针
    • 同类型指针赋值的兼容规则
  • 引用
    • 引用的特点
    • const引用
    • 作为形参替换指针
    • 其他引用形式
    • 引用和指针的区别
  • inline函数
  • 缺省参数
  • 函数重载
    • 判断函数重载的规则
    • 名字粉碎
    • C++编译时函数名修饰约定规则
  • 函数模板
  • 名字空间:nameplace
    • 命名空间的使用
  • new/delete
    • C++的动态内存管理
  • C11的新特性
    • 类型推导
      • auto的限制
      • 可以推导函数返回值
    • decltype关键字
    • 基于范围的for循环
      • 遍历数组(容器)
      • 基于范围的for循环
    • 指针空值--nullptr
    • typedef与using的使用
  • string的使用

统一初始化

初始化列表的方法:

int main() {int a = 10;int b{ 10 };int c(10);int ar[] = { 1,2,3,4,5,6,7,8 };int arr[]{ 1,2,3,4,6,5,7,8,9 };return 0;
}

输入输出

输入输出符

输入流:cin (键盘)
输出流:cout (控制台,屏幕)
使用cin和cout标准输入输出时,必须包含 (iostream)头文件以及std标准命名空间。

int main() {int a;int b;cin>>a>>b;//>>提取符cout<<"a="<<a<<"b="<<b<<endl;//<<插入符  endl<=>"\n"《=>换行return 0;
}

输入字符串

int main() {const int n = 128;char str[n];cin >> str ;cout << str<<endl;//输入abc cde输出abccin.getline(str,n);cout << str << endl;//输入abc def输出abc defcin.getline(str,n,'#');cout << str << endl;//输入def vyw# ugfua输出def vywreturn 0;
}

getline函数:
1)getline(istream &is,string &str,char delim);
2)getline(istream& is,string &str);
delim终结符 ,遇到该字符停止读取操作,不写默认回车

const与指针

c和c++中const的区别

c中const修饰一个变量,叫做常变量,其本质上还是一个变量,可以修改。而c++中const是一个常量,本质上不能修改。

int main() {const int a{ 10 };int ar[a]{ 1,2,3,4 };int* p =(int *) &a;*p = 20;printf("a=%d *p=%d \n", a, *p);
}
int main() {const int n{ 10 };int ar[n]{ 1,2,3,4 };int* p = (int*)&n;*p = 100;cout << "n=" << n << "p=" << *p<<endl;return 0;
}

const与指针的关系

此处存在三种情况如下:

int main() {int a=10,b=20;int* p=&a;//普通指针const int* p1=&a;//控制了解引用不能改变(解引用为常性)int const*p2=&a;//控制了解引用不能改变(解引用为常性,同上相同)int * const p3=&a;//控制了指针本身指向(指针变量自身为常性)const int* const p4=&a;//解引用和指针本身指向都进行控制
}

以上几种写法均正确,只是编译方式不同

常变量与指针

int main() {const int a=10;int* p1=&a;//error  a本身为常量,此处错误在于可以用*p解引用进行修改相矛盾const int* p2=&a;//OK const限制了解引用int * const p3=&a;//error,仅控制了指向,没有控制解引用const int* const p4=&a;//OKint *p5=(int*)&a;//OK 不安全return 0}

同类型指针赋值的兼容规则

能力强的指针赋值给能力收缩的指针

int main() {int a = 10, b = 20;int* p = &a;int* s1 = p;const int* s2 = p;int* const s3 = p;const int* const s4 = p;cout << "*p=" << *p << " *s1=" << *s1 << " *s2=" << *s2 << "*s3=" << *s3 << "*s4=" << *s4 << endl;return 0;
}

引用

引用的定义
类型& 引用变量名称=变量名称;
这就是引用变量的定义。&和类型结合称之为引用符号,不是取地址,代表别名的意思。

int main() {int a=10;int b=a;int &c=a;//引用定义时必须进行初始化return 0;
}

引用的特点

- [ ] List itemint main() {int a=10;int &b;//error 引用定义时必须进行初始化int &c=nullptr;//error 不存在空引用int& d=a;//OKinr&&e=a;//error 不存在双重引用
}

const引用

int main() {int a=10;const int b=20;int &x=b;//errorconst int &x=b;//OKconst int& y=a;//OKconst int &z=10;//OK
}

作为形参替换指针

使用指针替换两个变量值

void swap(int *x,int *y){int temp;temp=*x;*x=*y;*y=temp;
}
int main() {int a=10,b=20;swap(&a,&b);return 0;
}

使用引用替换两个变量的值

void swap(int &x,int &y){int temp=x;x=y;y=temp;
}
int main () {int a=10;int b=20;swap(a,b);return 0;
}

其他引用形式

int main() {int a=10,b=20;int ar[5]{1,2,3,4,5};int *p=&a;int *&rp=p;//引用指针int &x=ar[0];int (&br)[5]=ar;//引用数组return 0;	
}

引用和指针的区别

从语法规则上讲,指针变量存储某个实例(变量或对象)的地址;引用是某个实例的别名。
程序为指针变量分配内存区域;不为引用分配内存区域。
解引用是指针使用前要加上“ * ”;引用可以直接使用,不需要解引用
指针变量的值可以发生改变,存储不同实例的地址;引用在定义时就要被初始化,之后无法改变(不能是其他实例的引用)。
指针变量的值可以为NULL,引用不存在空引用。
指针变量作为形参时需要测试他的合法性(判空),引用不需要。
对指针变量使用sizeof得到的是指针变量的大小(4字节),对引用变量使用sizeof的到的是变量的大小。
理论上指针没有级数的限制(二级指针等),但是引用只有一级
++引用与++指针的效果不同:对指针变量++操作,会使指针变量指向下一个实体的地址;不改变实体本身的内容。但是对引用进行++操作就会直接影响到变量的本身。
不可以对函数中的局部变量或对象以引用或者指针的方式返回。

int * fun() {int a=10;return &a;
}
int &func_2() {int a=10;return a;
}
//以上两种方法均错误

此处我们在执行的过程中可以运行,但是为什么不能作为返回值呢?
当函数被调用时,函数的形参都在栈桢中,当使用指针或者引用作为返回值时,我们返回的都是这个局部变量的地址,但是函数返回时函数的栈桢会被回收,我们返回的这个地址也就会失效。但是我们为什么可以运行呢,因为这个地址还存在上一个栈桢的存留,因此可以进行使用该地址找到我们局部变量的值,如果这个栈桢被骚扰,或者说这个栈桢被一个新的函数调用时作为了另一个函数的栈桢,返回的地址上的值就会被改变,就不是我们所期望的值。因为我们不能确定该栈桢有没有被骚扰,所以不能用指针或者引用作为返回值。

inline函数

当程序执行函数调用时,系统要进行建立栈空间进行保护现场,传递参数,控制程序执行和转移等当一个函数功能简单且执行多次,为了提高效率,直接将函数的代码嵌入到程序中,这个办法会存在两个缺点,一是书写相同代码,二是程序可读性往往没使用函数的好。为了协调好效率和可读性之间的矛盾,c++r提供了另一种方法–内联函数,方法是在函数定义时用修饰词inline。

inline bool IsNumber(char ch) {return ch >= '0' && ch <= '9' ? 1 : 0;
}

例如该函数,在其面前加上inline关键字,该函数就变成了内联函数,编译期间编译器能够在调用点内联展开该函数。
inline是一种以空间换时间的做法,省去调用函数的开销。但是函数体的代码过长或是递归函数即便加上inline关键字也不会在调用点内以内联展开该函数。
inline对编译器而言只是一个建议,编译器会自动优化。
inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

//A.h
#pragma once
inline bool IsNumber(char ch);
//A.cpp
#include"A.h"
inline bool IsNumber(char ch) {return ch >= '0' && ch <= '9' ? 1 : 0;
}
//main.cpp
#include"A.h"
#include<iostream>
using namespace std;int main() {char c = '4';bool i=IsNumber(c);cout << i << endl;
}
//无法解析的外部符号 "bool __cdecl IsNumber(char)" (?IsNumber@@YA_ND@Z),函数 _main 中引用了该符号	测试	D:\tulun\测试\main.obj	1	

那在什么情况下使用内联函数什么情况下使用普通函数呢?
如果函数的执行开销小于开栈清栈开销(函数体较小),使用inline处理效率高,如果函数执行开销大于开栈清栈开销,使用普通函数方式处理。
内联函数和宏定义的区别:

  • 内联函数在编译时展开,代餐的宏在预编译时展开
  • 内联函数直接嵌入到目标代码中,带参的宏时简单的做文本替换。
  • 内联函数有类型检测,语法判断功能,宏只是替换

缺省参数

一般情况下,函数调用时的参数个数和形参相同,但是为了更方便的使用函数,c++也允许定义具有缺省参数的函数,这种函数调用时,参数个数可以与形参不相同。
缺省参数指在定义时函数时为形参指定缺省值。
这样的函数在调用时,对于缺省函数,可以给出实参,也可以不给出参数值。如果给出实参,将实参传递给形参进行调用,如果不给出实参,则按缺省值进行调用。
缺省参数的函数调用:缺省参数并不一定时常量表达式,可以是任意表达式,甚至可以通过函数调用给出。如果缺省实参时任意表达式,则函数每次被调用时则表达式被要求重新求值。但是表达式必须有意义。

#include<iostream>
int add1(int a=3,int b=6){return a+b;
}
int main() {cout<<add1()<<endl;//9cout<<add1(4)<<endl;//10cout<<add1(1,2)<<endl;//3return 0;
}

缺省参数可以有多个,但所有缺省参数必须放在参数,但是所有缺省参数必须放在参数表的右侧,即先定义所有的非缺省参数,在定义缺省参数。这是在函数调用时,参数自左向有逐个匹配,当实参个形参个数不一致时只有这样才不会产生二义性。
多文件结构

//A.h
void fun(int ,int b=23,int c=8000);
//void fun(int ,int =23.int =8000);
//A.cpp
void fun(int a,int b , int c) {cout << "a=" << a << "b=" << b << "c=" << c << endl;
}
//main.cpp
int main() {using namespace std;fun(12);fun(10, 20);fun(10, 20, 30);return 0;
}

运行结果:在这里插入图片描述
习惯上,缺省参数在公共头文件包含的函数声明中指定,不要再函数定义中指定。如果再函数的定义中指定缺省参数值,再公共头文件包含的函数声明中不能再次指定缺省参数值。缺省实参不一定必须是常量表达式,可以是任意表达式。

int my_rand() {srand(time(NULL));int ra = rand() % 100;return ra;
}
void fun(int a, int b = my_rand()) {cout << "a=" << a << "b=" << b << endl;}
int main() {fun(12);return 0;
}

当缺省实参是一个表达式时 ,在函数被调用时该表达式被求值。(c语言不支持)

函数重载

C语言实现int,double,char类型的比较大小函数。

int my_max_i(int a,int b) {return a>b?a:b;}
double my_max_d(double a,double b) {return a>b?a:b;}
char my_max_c(char a,char b) {return a>b?a:b;}

这些函数都执行了相同的一般性动作,都返回两个形参中的最大值;从用户角度来看,只有一种操作,就是判断最大值。这种词汇上的复杂性不是“判断参数中的最大值”问题本身固有的,二十反应了程序设计环境的一种局限性:在同一个域中出现的名字必须指向一个唯实体(函数体)。
这就要程序员记住每一个函数的名字,函数重载解决了这种问题。
函数重载:在C++中可以为两个或两个以上的函数提供相同的函数名称,只要参数类型不同或者参数类型相同而参数个数不同称为函数重载

int my_max(int a, int b) {return a > b ? a : b;
}
double my_max(double a, double b) {return a > b ? a : b;
}
char my_max(char a, char b) { return a > b ? a : b;
}int main() {int ix = my_max(1, 2);double dx =my_max (12.23, 23.45);char cx = my_max('a', 'b');return 0;}

如上,如果两个参数表中的参数个数或者顺序不同则认为两个函数重载。

判断函数重载的规则

1.如果两个参数的参数相同,但是返回类型不同,会被标记为编译错误,函数的重复声明。

int my_max(int a,int b){return a>b?a:b;}
unsigned int my_max(int a,int b){return a>b?a:b;}
int main() {int ix=my_max(12,23);unsigned int=my_max(12.23);//error 返回值为intreturn 0;
}

2.参数表的比较过程与形参名无关

int my_add(int a,int b);
int my_add(int x,int y);

3.如果两个函数的参数表中只缺省参数不同,则第二个声明被歧视为第一个的重复声明。

void Print(int*br,int n);
void Print(int* br,int len=10);

4.typedef名为先右数据提供了一个替换名,他并没有创建一个新类型,因此,如果两个参数表的区别只在于一个使用了typedef,而另一个使用了与typedef,而另一个使用了与typedef相应的类型。则该参数表被视为相同的参数列表。

typedef unsigned int u_int;
int Print(u_int a);
int Print(unsigned int b);

5.当一个参数类型又const或colatile修饰时,如果形参是按值传递方式定义,再识别函数声明是否相同时并不考虑修饰符。

void fun(int a) {}
void fun(const int a){}

6.当一个形参类型又const或者volatile修饰时,如果形参定义指针或引用时,在识别函数声明是否是相同时,就要考虑const修饰词。

void fun(int* p) {}
void fun(const int*p) {}
void fun(int& a) {}
void fun(const int &a) {}

7.注意函数调用的二义性,如果在两个函数的参数表中,形参类型相同,而形参个数不同,形参默认值将会影响函数的重载。

void fun(int a) {}
void fun(int a,int b) {}
void fun(int a,int b=10);

8.函数重载解析的步骤如下

  • 确定函数调用考虑的重载函数的结合,确定函数调用中实参表的属性,
  • 从重载函数集合中选择函数,该函数可以在(给出实参个数和类型)的情况下可以调用函数
  • 选择与调用最匹配的函数。

名字粉碎

在c++中可以实现函数重载就是因为名字粉碎技术使得重载函数在编译过程中进行了区别。例如:
在这里插入图片描述
_fastcall调用约定在输出函数名前加上一个“@”符号,在函数名后面也是一个“@”符号和其参数的字节数。格式为:@functionname@number
在这里插入图片描述

C++编译时函数名修饰约定规则

_cdecl调用约定
1.以“?”表示函数名的开始,后面跟函数名
2.函数名后面以@@YA表示参数表的开始,后跟参数表;
3.参数表以代号表示:
在这里插入图片描述
PA–表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以“0”代替,一个“0”代表一次重复
4.参数表的第一项为该函数的返回值类型,其后一次为参数的数据类型,指针表示在其所指护具类型前;
5.参数表后以“@Z”标识整个名字的结束,如果该函数无参数,则以“Z”标识结束。
在这里插入图片描述

函数模板

为了代码重用,代码就必须是通用的;通用的代码就必须不受数据类型的限制。那么我们可以把数据类型改为一个设计参数。这种类型的程序设计我们称之为参数化程序设计。软件模块由模板构造,包括函数模板和类模板。
函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,简化重载函数的设计。函数模板定义如下:

template<模板参数表>
返回类型 函数名(形式参数表) {...;//函数体
}

<模板参数表>,尖括号中不能为空,参数可以有多个,用逗号分开,模板参数主要是模板类型参数。
模板类型参数代表一种类型,由关键字class或typenname后加一个标识符构成,在这里两个关键字意义相同,他们表示后面的参数名代表一个潜在的内置或用户设计的类型。

template<class T>
T my_max(T a,T b){return a>b?a:b;
}
int main() {my_max(12,23);my_max('a','b');my_max(12.34,23,56);return 0;
}

在这里插入图片描述
在编译过程中,根据函数模板的实参构造出独立的函数,这就是模板函数,这个构造过程称之为模板实例化。

名字空间:nameplace

在C++中支持三种域:局部域,命名空间域,类域。命名空间域即使随C++引入的,相当于给一个文件域用花括号把文件的一部分括起来,并以关键字namespace开头给他起名。括起来的部分称为声明块(可以包括类,变量,函数等)。主要为了解决全局名字空间污染问题,即命名冲突。举例:

namespace yhp{int g_max=10;int g_min=0;int my_add(int a,int b){return a-b;}
}

名字空间域可以进行分层嵌套,同样有分层屏蔽作用,同一个工程中允许存在多个相同的明明空间,编译器最终会合成同一个命名空间。

命名空间的使用

1.加命名空间及作用域限定符

int main() {int a=yhp::my_add(12,23);printf("%lf n",Primer::pi);Primer::MAtrix::my_max('a','b');return 0;
}

2.使用using将名字空间中成员引入
使用using声明可只写一次限定修饰名。usiing声明以关键字using开头,后面是别限定修饰的名字空间成员名:

using yhp::pi;
using Primer::Matrix::my_max;
int main() {printf("%lf n",Primer::pi);printf("%f n",pi);my_max('a','b');return 0;
}

3.使用using namespace名字空间名称引入
使用using指示符可以一次性的使用空间中的所有成员直接被使用,比using声明方便。

//A.h
namespace yhp {int my_add(int, int);int my_sub(int,int);
}
//A.cpp
#include"A.h"
namespace yhp {int my_add(int a, int b) {return a + b;}int my_sub(int a, int b) {return a - b;}
}
//main.cpp
#include"A.h"
#include<iostream>
using namespace std;using namespace yhp;int main() {printf("%d n",my_add(12, 23));return 0;
}

使用using指示符,标准C++库中所有组件都在一个std的名字空间中声明和定义的,所以使用标准C++库只写一个using指示符:using namespace std;就可以直接使用标准C++库中所有成员。

new/delete

可执行空间的虚拟地址空间:在这里插入图片描述

内核:操作系统
栈区:函数的形参,非静态的局部变量,函数现场保护数据等等 栈是向下增长的。
共享库的内存映射区域:用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,做进程通信。
堆区:用于程序运行时动态分配内存,堆时可以向上增长的。
数据段:存储全局数据和静态数据。
代码段:可执行的程序和常量数据。
C语言的动态内存管理用malloc,calloc,realloc等函数。

int* ipa=(int*)malloc(sizeof(int)*n);
int *ipb=(int*)calloc(n,sizeof(int));
ipa=(int*)realloc(ipa,sizeof(int)*n*2);

C++的动态内存管理

1.new的运算符使用

int main() {int n=10;int* ipa=new int(10);//直接进行赋值int* ipb=new int[3]{1,2,3};int* ipc=new int[n]{1,2,3,4,5,6,7};//数组进行赋值delete ipa;delete[]ipb;//释放delete[]ipc;return 0;
}

2.new的函数方式使用

int main() {int n = 10;int* ipa = (int*)::operator new(sizeof(int));int* ipb = (int*)::operator new(sizeof(int) * n);::operator delete(ipa);::operator delete(ipb);return 0;
}

3.定位new(placement newexpression)的使用

int main() {int n=10;int* ipa=(int*)malloc(sizeof(int));int* ipb=(int*)::operator new(sizeof(int)*n);new(ipa)int(20);new(ipb)int[]{1,2,3,4,5,6,7,8,9};free(ipa);::operator delete(ipb);return 0;
}

4.对于内置类型new/delete/malloc/free可以混用。
区别:

  • new/delete是C++中的运算符。malloc/free是函数。
  • malloc申请内存空间时,手动计算所需大小,new只需类型名,自动计算大小;
  • malloc申请的内存空间不会初始化,new可以初始化;
  • malloc的返回值为void*,接收时必须强转,new不需要;
  • malloc申请内存空间失败时,返回的是NULL,使用时必须判空;new申请内存空间失败时抛出异常,所以要有捕获异常处理程序。

C11的新特性

类型推导

auto类型推导:auto定义的变量,可以根据初始化的值,在编译时推导出变量名的类型。

int main() {auto x=5;//x为int类型auto pi=new auto(1);// pi被推到为int*const auto *xp=&x,u=6//xp是const int*类型,u是const int类型static auto dx=0.0//doubleauto int b;//C11中auto不再表示存储类型指示符auto s;//error 没有初始化 auto无法推导出s的类型
}
int main() {auto x=5;const auto *xp=&x,u;//errorconst auto* ip=&x,u=6.0;//errorreturn 0;
}

1.虽然经过前面const auto* xp=&x推导,auto的类型可以确定为int了,但是仍要写后面的=6,否则编译器不予通过。
2.u的初始化不能使编译器推导产生二义性。
auto的一些使用方法可以和同指针,引用结合起来使用,还可以带上cv限定。
1)当不声明为指针或引用时,auto的推到结果和初始化表达式抛弃引用和cv限定后类型一致.
2)当声明为指针或引用时,auto的推导结果将保持初始化表达式的cv属性。
auto不能作为函数形参类

auto的限制

  • C11中auto称为类型指示符
  • auto不能用于函数参数
  • auto不能用于非静态成员变量
  • auto无法定义数组
  • 实例化模板时不能使用auto作为模板参数

可以推导函数返回值

template<class T>
T my_max(T a,T b){return a>b?a:b;
}int main() {auto x=my_max(12,23);auto y=my_max('a','b');cout<<x<<"    "<<y<<endl;return 0;
}

decltype关键字

auto所修饰的变量必须被初始化,即必须要定义变量,若仅希望得到类型不需要定义变量应该怎么办呢?C++11新增了decltype关键字:decltype(exp),exp表示一个表达式,器推导过程是在编译器完成的,不会真正的计算表达式的值。

int main() {int x=10;decltype(x) y=1;//y->intconst int &i=x;decltype(i) j=y;//j->const int &decltype(x+y) z=0;//z->intconst decltype(z)*ip=&z;//*ip->int,ip->int*
}

也可以用于函数表达式,但不会真正计算表达式的值。

基于范围的for循环

不同容器和数组,遍历的方法不尽相同,写法不同意,也不够简洁,而C++11基于范围的fpr循环以统一,简洁的方式来遍历容器和数组,用起来更加方便了。

遍历数组(容器)

int main(){int arr[]={1,2,3,4,5};int len=sizeof(arr)/sizeof(arr[0]);int* ip=NULL;for(ip=arr;ip!=ip+len;ip++){cout<<*ip<<endl;}
}

基于范围的for循环

int main() {int arr[]={1,2,3,4,5};for(int x:arr){cout<<x<<" ";	}return end;return 0;
}

模板:

for(ElenType val:array){...//循环体
}
//ElenType:是范围变量的数据类型。他必须是数组元素相同的数据类型,或者数组元素可以自动转换过来的类型。
//val:是范围变量的名称。
//array:是让该循环体进行处理的数组名称
//循环体中可以用continue结束本次循环,也可以用break跳出循环

可以使用auto自动推导出val类型

int main() {int ar[]={1,2,3,4,5};for(auto x:ar){x+=10;cout<<x<<" ";}
}

指针空值–nullptr

  • nullptr是C11新引入的指针控制类型的常量,在C++中可以直接使用。
  • sizeof(nullptr)与sizeof((void*)0)所占字节数相同都(4,8)。
  • 为了提高代码的健壮性,在后续表示指针空值最好用nullptr。

typedef与using的使用

typedef unsigned int uint;
using uint=unsigned int;template<class _Ty>
using pointer=_Ty*;
int main() {int x=10;double dx=12.25;pointer<int>ip=&x;pointer<double>dp=&dx;return 0;
}

string的使用

int main() {char str[] = { "tulun" };int len = strlen(str);string s1 = "tulun";for (int i = 0; i < len; ++i) {cout << str[i];}for (int i = 0; i < s1.size(); ++i) {cout << s1[i];}cout << s1 << endl;s1 = "hello";cout << s1 << endl;s1 += "tulun";cout << s1 << endl;cin >> s1;cout << s1 << endl;return 0;
}

运行结果:在这里插入图片描述

相关文章:

【c++基础】

C基础入门统一初始化输入输出输入输出符输入字符串const与指针c和c中const的区别const与指针的关系常变量与指针同类型指针赋值的兼容规则引用引用的特点const引用作为形参替换指针其他引用形式引用和指针的区别inline函数缺省参数函数重载判断函数重载的规则名字粉碎C编译时函…...

语音识别技术对比分析

文章目录一、语音识别产品对比二、百度语音识别产品1、套餐及价格&#xff1a;2、官网3、调研结果三、华为语音识别产品四、阿里云语音识别产品1、套餐及价格&#xff1a;2、官网地址3、调研结果五、科大讯飞语音识别产品1、套餐及价格&#xff1a;2、官网3、调研结果六、有道语…...

Idea git 回滚远程仓库版本

目标 回滚远程仓库到特定版本。 将【添加test03】版本回滚到【行为型模式】版本。 回滚前的效果图 步骤 ①复制需要回滚到的版本的版本号 ②右键项目&#xff0c;选择Git-Repository-Reset Head ③Reset Type选择Hard&#xff1b;To Commit填入步骤①复制的版本号&#xff…...

vscode C++配置

program&#xff1a;调试入口文件的地址cwd&#xff1a;程序启动调试的目录miDebuggerPath&#xff1a;调试器的路径launch.json// { // // Use IntelliSense to learn about possible attributes. // // Hover to view descriptions of existing attributes. // /…...

【微电网_储能】基于启发式状态机策略和线性程序策略优化方法的微电网中的储能研究【给定系统约束和定价的情况下】(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…...

rk3288-android8-IR-mouse

IR问题: mouse按键使用不了 然后排查: 1.排查上报 ir_key6{ rockchip,usercode <0xbf00>;rockchip,key_table <0xff KEY_POWER>,<0xfe KEY_MUTE>, <0xfd KEY_1>, <0xfc KEY_2>, <0xfb KEY_3>, <0xfa KEY_4>, <0xf9 KEY_5>…...

2023-03-01干活小计

昨天组会&#xff0c;元气大伤&#xff0c;拖更直接。今天继续&#xff0c;三月加油&#xff01; python魔术方法&#xff1a; __repr__:print()时候调用&#xff0c;注意函数返回值就是打印值。 __len__:len()时候调用 __call__:实例()时候调用 __getitem__:self[i]时候调…...

客户服务软件推荐榜:28款!

在这个竞争激烈的时代&#xff0c;做到服务对企业的存亡有着深刻的意义。改善客户服务&#xff0c;做好客户服务工作&#xff0c;是关键&#xff0c;因为客户服务团队代表着企业的形象&#xff0c;面孔&#xff0c;客户有可能 不大会记得企业的某个东西&#xff0c;但是他们将会…...

Spring注入和注解实现IOC

标题注入依赖注入的方式通过Set方法注入通过构造方法注入自动注入依赖注入的数据类型注入Bean对象注入基本数据类型和字符串注入List注入Set注入Map注入Properties注解实现IOCComponentRepository、Service、Controller注入 依赖注入的方式 在使用依赖注入时&#xff0c;如果…...

Python统计Labelme标注文件信息并绘制散点图

Python统计Labelme标注文件信息并绘制散点图前言前提条件相关介绍实验环境Python统计Labelme标注文件信息并绘制散点图前言 本文是个人使用Python处理文件的电子笔记&#xff0c;由于水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击…...

远程接入方案 OpenText Exceed TurboX(ETX) 客户案例——ET Innovations

远程接入方案 OpenText Exceed TurboX&#xff08;ETX) 客户案例——ET Innovations ET Innovations GmbH 助力奥地利各地的医疗保健专业人员提升患者体验 医疗保健信息系统开发商利用 OpenText™ Exceed™ TurboX 将远程访问其软件的稳定性提高了 95% 公司&#xff1a;ET I…...

Django4.1.7通过djongo1.3.6链接mongoDB6.0.4

网上中文版的djongo链接mongoDB基本都是抄袭州的先生大哥的文章。 文章成文比较久&#xff0c;至少是2019年成文的了&#xff0c;有一些情况发生了变化&#xff0c;今天就自己测试的情况做一些记录。 本文成文日期为&#xff1a;2023年3月2日&#xff0c;请注意参考 废话不多说…...

如何使用FindFunc在IDA Pro中寻找包含指定代码模式的函数代码

关于FindFunc FindFunc是一款功能强大的IDA Pro插件&#xff0c;可以帮助广大研究人员轻松查找包含了特定程序集、代码字节模式、特定命名、字符串或符合其他各种约束条件的代码函数。简而言之&#xff0c;FindFunc的主要目的就是在二进制文件中寻找已知函数。 使用规则过滤 …...

【C++】讲的最通透最易懂的关于结构体内存对齐的问题

目录1. 内存对齐规则2. 简单易懂的内存对齐示例2.1 简单结构体2.2 含位域的结构体2.3 空类的大小2.4 嵌套结构体3. 为什么需要内存对齐&#xff1f;4. 类型在不同系统下所占字节数1. 内存对齐规则 第一个成员在与结构体变量偏移量为0的位置处。其他成员变量要对齐到某个数字&a…...

Stochastic Approximation 随机近似方法的详解之(一)

随机近似的定义&#xff1a;它指的是一大类随机迭代算法&#xff0c;用于求根或者优化问题。 Stochastic approximation refers to a broad class of stochastic iterative algorithms solving root finding or optimization problems. temporal-difference algorithms是随机近…...

软件自动化测试工程师面试题集锦

以下是部分面试题目和我的个人回答&#xff0c;回答比较简略&#xff0c;仅供参考。不对之处请指出 1.自我介绍 答&#xff1a;姓名&#xff0c;学历专业&#xff0c;技能&#xff0c;近期工作经历等&#xff0c;可以引导到最擅长的点&#xff0c;比如说代码或者项目 参考&a…...

智合同丨教你做一个懂AI的法律人

作为一名法律人&#xff0c;合同审核工作是日常工作中最基本也是必不可少的一项事务。我们知道&#xff0c;一般在企业&#xff0c;合同审批会涉及到众多部门和职务角色&#xff0c;最关键的一环其实在法务或者律师建议&#xff0c;其他部门给出的审批意见基本上都是基于自己部…...

如何判断自己使用的IP是独享还是共享?

在互联网上&#xff0c;我们常常听到独享IP和共享IP这两个概念。独享IP指的是一个IP地址只被一个用户或一个网站所使用&#xff0c;而共享IP则是多个用户或多个网站共用一个IP地址。那么&#xff0c;如何分辨IP是不是独享呢?接下来&#xff0c;我们将从几个方面来看。在这之前…...

跳石头

题目描述 一年一度的"跳石头"比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳…...

上传gitee教程,Gitee怎么上传代码到仓库

目录 第一步&#xff1a;配置git的用户名和邮箱 第二步&#xff1a;上传到远程仓库 第三步&#xff1a;将仓库的master分支拉取过来和本地的当前分支进行合并 第四步&#xff1a;将修改的所有代码添加到暂存区 第五步&#xff1a;将缓存区内容添加到本地仓库&#xff08;…...

netstat命令详解

1、下载netstat命令对应的软件包 yum install net-tools -y2、netsta命令介绍 [rootvm01 ~]# man netstatNETSTAT(8) Linux System Administrators Manual NETSTAT(8)NAMEnetstat - Print network connections, routing t…...

数据库三范式

文章目录数据库三范式1. 第一范式&#xff08;1NF&#xff09;2. 第二范式&#xff08;2NF&#xff09;3. 第三范式&#xff08;3NF&#xff09;数据库三范式 第一范式&#xff1a;有主键&#xff0c;具有原子性&#xff0c;字段不可分割第二范式&#xff1a;完全依赖&#xf…...

K8S 1.20 弃用 Docker 评估之 Docker 和 OCI 镜像格式的差别

背景 2020 年 12 月初&#xff0c;Kubernetes 在其最新的 Changelog 中宣布&#xff0c;自 Kubernetes 1.20 之后将弃用 Docker 作为容器运行时。 弃用 Docker 带来的&#xff0c;可能是一系列的改变&#xff0c;包括不限于&#xff1a; 容器镜像构建工具容器 CLI容器镜像仓…...

Vue2和Vue3响应式的区别

数据响应式是什么&#xff1f; ​所谓 数据响应式 就是建立 响应式数据 与 依赖&#xff08;调用了响应式数据的操作&#xff09;之间的关系&#xff0c;当响应式数据发生变化时&#xff0c;可以通知那些使用了这些响应式数据的依赖操作进行相关更新操作&#xff0c;可以是DOM…...

模型实战(6)之Alex实现图像分类:模型原理+训练+预测(详细教程!)

Alex实现图像分类:模型原理+训练+预测 图像分类或者检索任务在浏览器中的搜索操作、爬虫搜图中应用较广,本文主要通过Alex模型实现猫狗分类,并且将可以复用的开源模型在文章中给出!!!数据集可以由此下载:Data本文将从以下内容做出讲述: 1.模型简介及环境搭建2.数据集准…...

【大数据】最全的大数据Hadoop|Yarn|Spark|Flink|Hive技术书籍分享/下载链接,持续更新中...

这里写目录标题Hadoop大数据处理Hadoop技术内幕&#xff1a;深入解析YARN架构设计与实现原理Hadoop 技术内幕&#xff1a;深入解析Hadoop Common 和HDFS 架构设计与实现原理Spark SQL内核剖析Hadoop 应用架构深度剖析Hadoop HDFSHadoop实战Hive编程指南Hadoop大数据处理 本书以…...

RIG Exploit Kit 仍然通过 IE 感染企业用户

RIG Exploit Kit 正处于最成功的时期&#xff0c;每天尝试大约 2000 次入侵并在大约 30% 的案例中成功&#xff0c;这是该服务长期运行历史中的最高比率。 通过利用相对较旧的 Internet Explorer 漏洞&#xff0c;RIG EK 已被发现分发各种恶意软件系列&#xff0c;包括 Dridex…...

GIS在地质灾害危险性评估与灾后重建中的实践技术应用及python机器学习灾害易发性评价模型建立与优化进阶

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…...

SQL SERVER中SCHEMA的詳解

SQL SERVER中SCHEMA的講解1. Introduction1.1 優勢1.2 內置schema2. Create Schema2.1 Parameters2.2 Sql3.Awakening1. Introduction 1.1 優勢 数据库模式为我们提供了在数据库中创建逻辑对象组的灵活性。如果多个团队使用同一个数据库&#xff0c;我们可以设计各种模式来分組…...

【LeetCode】剑指 Offer(13)

目录 题目&#xff1a;剑指 Offer 31. 栈的压入、弹出序列 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;剑指 Offer 31. 栈…...

网站上传程序流程/最新足球赛事

批处理for命令详解FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能!看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号)FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令参数:FOR有4个参数 /d /l /r /f 他们的作用我在下面用例子解释…...

手工做皮具国外的网站/windows7优化大师

作业模拟实现词法分析器&#xff0c;记录一下。 题目&#xff1a; 一、待分析的C语言子集的词法 关键字 main if else int return void while &#xff08;都是小写&#xff09; 专用符号 — * / < < < > ! &#xff1b; &#xff1a; &#xff0c;{ } [ ] …...

保定网络公司建设网站/电脑优化大师有用吗

首先写好一个列表写好的样式是这样滴操作来了在computed里面定义了一个search函数 使用filter过滤接下来在method 里面写一个sousuo1函数 进行一个判断 如果搜索这个输入框框里是空 就是展示原数据 如果这个不为空 就会展示搜索到的数据最后 很重要把list改为sousuo1()这个函数…...

北京网站优化托管/引流推广网站

配置kotlin的环境变量&#xff0c;添加到path 下载kotlin的编译器工具 下载后解压放到固定目录下&#xff0c;找到bin文件夹添加到path&#xff0c;配置完成后使用 路径如&#xff1a;D:\kotlinc\bin 命令&#xff1a; kotlinc -version 查看是否安装成功 安装插件 安装Kot…...

百度统计搜索词为什么有与网站不相关的词/工作手机

摘要&#xff1a;在当今信息化时代&#xff0c;大多数企业都需要网络支撑企业的ICT运行&#xff0c;提升企业运行效率&#xff0c;针对企业网络中的网元设备&#xff08;包括交换机&#xff0c;路由器&#xff0c;防火墙等&#xff09;&#xff0c;很多企业希望根据自身的业务特…...

wordpress 密匙 和授权/网站推广优化教程

主要是针对新手会出现的问题&#xff0c;我第一次用GitHub上传代码时&#xff0c;因为个别文件较大所以就报了以上错误&#xff0c;在本地删除之后&#xff0c;仍然会报相同错误&#xff0c;说明已经存到git某缓存区了&#xff0c;可以如下操作来修改&#xff1a; 比如我之前删…...