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

C++的入门

C++的关键字

C++总计63个关键字,C语言32个关键字
在这里插入图片描述

命名空间

我们C++的就是建立在C语言之上,但是是高于C语言的,将C语言的不足都弥补上了,而命名空间就是为了弥补C语言的不足。

看一下这个例子。在C语言中会报错

#include<stdio.h>
#include<stdlib.h>int rand = 10;int main()
{printf("%d ", rand);return 0;
}

在这里插入图片描述

原因就是在我们#include<stdlib.h>中,定义了rand ,但是我们自己也定义了一个全局变量rand,这样就重定义了,C语言无法解决这个问题。
所以我们这是C++,为了解决这个问题,就引用了命名空间的概念。

我们在C语言中,我们们接触的一共有两个,
一个是全局域,一个是局部域。他们的使用,和生命周期不一样。
而在这两个域中,我们可以声明同一个名字的变量,这是可以的。

但是我们想在局部作用域中,找命名相同的全局域的东西可以吗?
答案是可以的,这是就要用到我们的域作用符 ::,前面的空格就表示全局域。
看下面代码

#include<stdio.h>
#include<stdlib.h>int a = 10;void f1()
{int a = 0;printf("%d\n", a);printf("%d\n", ::a);
}int main()
{f1();return 0;
}

在这里插入图片描述

命名空间定义了什们?
命名空间域,只影响使用,不影响生命周期。
这时就需要一个关键字—namespace
命名空间怎么用?
当我们的命名存在冲突的时候,将各自的内容用namespace定义的域包括起来(这时我们自己定义这个域名),当我们要找的时候就用就域操作符::,找到我们的域名,就可以找到我们的命名冲突的东西。请看下列例子。
namespace List
{struct Node{struct QNode* next;struct QNode* prev;int val;};
}namespace Queue
{struct Node{struct QNode* next;int val;};}int main()
{//f1();struct Queue::Node node1;struct List::Node node2;return 0;
}

注意我们的命名空间,可以嵌套。

使用方法

1.指定命名空间访问。

每次使用的时候,我们都使用域作用符表明他的域

namespace Queue
{struct Node{struct QNode* next;int val;};struct QueueNode{struct Node* head;struct Node* tail;};void QueueInit(struct QueueNode* q){}void QueuePush(struct QueueNode* q,int x){}
}int main()
{struct Queue::QueueNode q;Queue::QueueInit(&q);Queue::QueuePush(&q,1);Queue::QueuePush(&q,2);
}

2.全局展开(一般情况,不建议全局展开)

我们用一次展开一次,太繁琐了,我们怎样可以简单一点呢?

就是用全局展开,
代码为using namespace + 域名

namespace Queue
{struct Node{struct QNode* next;int val;};struct QueueNode{struct Node* head;struct Node* tail;};void QueueInit(struct QueueNode* q){}void QueuePush(struct QueueNode* q,int x){}
}using namespace Queue;int main()
{struct QueueNode q;QueueInit(&q);QueuePush(&q,1);QueuePush(&q,2);
}

所以我们写C++,代码的时候,
我们要加上一句using namespace std,将我们库文件的东西全局展开。
但是这种方法不太好,将我们好不容易建立的库,就有展开了,相当于没有命名空间了
所以我们以后进公司写项目,禁止这样写代码,但是我们在前期学习阶段,我们是可以这样的,因为这样很方便。

3.部分展开

就是将常用的展开。具体看下面的例子

#include<iostream>//常用的展开
using std::cout;
using std::endl;int main()
{cout << "1111" << endl;cout << "1111" << endl;cout << "1111" << endl;cout << "1111" << endl;int i = 0;std::cin >> i;
}

cin和cout的理解

其实就是流,输入流,和输出流。
我们可以简单的认为,
cout相当于printf
cin相当于scanf

他们的优势
自动识别类型。
不用想我们的printfscanf需要指定类型,%d,%f,但是我这个就不用,他自动识别类型。
#include<iostream>
using namespace std;int main()
{cout << "hello world" << endl;cout << "hello world" << '\n';int n;double* a = (double*)malloc(sizeof(double) * n);if (a == NULL){perror("malloc fail");exit(-1);}cin >> n;for (int i = 0; i < n; i++){cin >> a[i];}for (int i = 0; i < n; i++){cout << a[i] << endl;}
}

在这里插入图片描述

缺省参数

也是为了弥补c语言的缺陷。

这是通过函数使用的,在c语言中,当我们的函数有参数的时候,我们在用这个函数的时候,我们必须传这个参数。
而缺省参数的作用,就是我们在函数传参的时候,可以不用传参数。在我们不传参数的时候,就会把我们的默认参数传上。

void Func(int a = 0)
{cout << a << endl;
}int main()
{Func(1);Func();return 0;
}

在这里插入图片描述

多个缺省参数

//全缺省
void Func(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;cout << endl;}int main()
{Func(1, 2, 3);Func(1, 2);Func(1);Func();return 0;
}

在这里插入图片描述

注意:不可以跳着传,使用缺省值,必须从右往左连续使用
下列用法不可以,这是规定没有为什们
Fun( ,2, );
Fun( , , 3);

半缺省

注意:必须从右往左连续缺省,不能跳跃缺省

//这样是可以的
void Func(int a, int b = 10, int c = 20) {cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl; }
int main()
{Func(1, 2, 3);Func(1, 2);Func(1);return 0;
}
//这样是错误的,完全不可以
void Func(int a = 10, int b , int c = 20) {cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl; }
注意
缺省参数不能在函数声明和定义中同时出现。
推荐在声明的时候给我们的缺省参数)
如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该 用那个缺省值。
	void Func(int a = 10); void Func(int a = 20) {}

函数重载

其实这也是为了解决c语言的缺陷,当一个函数同名的时候,我们就会重定义。

可能你会想,为什们要函数重载,函数本来就不能同名呀。
那你大错特错了,我们看完下面这个例子就知道了。

函数重载的定义
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

函数返回值不同,不能构成函数重载。
是因为我们调用的时候可以不接受返回值,但是和没有返回值的函数无法区分,所以才不可以。

参数类型不同

// 1、参数类型不同
int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}
double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}
int main()
{Add(1, 2);Add(1.1, 2.2);return 0;
}

参数个数不同

// 2、参数个数不同 
void f()
{cout << "f()" << endl;
}
void f(int a) 
{cout << "f(int a)" << endl;
}

参数顺序不同

// 3、参数类型顺序不同 
void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}

编译器怎么分辨这些相同名字的函数呢

  1. 实际项目通常是由多个头文件和多个源文件构成,我们知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标
    文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?
  2. 所以链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。
  3. 那么链接时,面对Add函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的 函数名修饰规则。
  4. 由于Windows下vs的修饰规则过于复杂,而Linux下g++的修饰规则简单易懂,下面我们看g++演示了这个修饰后的名字。
  5. 通过下面我们可以看出gcc的函数修饰后名字不变。而g++的函数修饰后变成【_Z+函数长度 +函数名+类型首字母】。

引用

什们是引用?(就是取别名)
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
比如:你有大名和小名,但那都是你,而引用就相当于这个。
引用怎么写?
就是类型后面加一个&。
要区别赋值和引用。
在这里插入图片描述

那我们用一下&,写一下我们的交换函数,就不用再传指针了。

//输出型参数
//形参的改变要影响实参。
void Swap(int& x, int& y)
{int tmp = x;x = y;y = tmp;
}int main()
{int i = 10;int j = 20;Swap(i, j);printf("i=%d\n", i);printf("j=%d\n", j);return 0;
}

引用特征

  1. 引用必须在定义的时候初始化。
  2. 一个变量可以有多个引用

引用做返回值

我们先看一个场景,看完下面这个场景,我问一个问题,

在函数的返回值中我们是将函数中的n返回了吗?
答案是否定的,我们n是一个局部变量,他的生命周期就是在函数中,一但出了函数,那么它就会被销毁。
那么有的同学就会想:他是怎么传出来的呢?
其实编译器会将我们的n拷贝一个临时变量(临时变量具有常性),然后用这个临时变量将我们的n传给我们的ret

同时我们想优化一下他,我们也是不可以的,我们没有办法优化,但是我们看第二个例子

int  count()
{int n = 0;n++;return n;
}
int main()
{int ret = count();return 0;
}

第二个例子不太一样,我们的n存放在静态区,当函数被销毁的时候我们的n还在,但是这是有的同学会问,那么它传返回值是直接用n传吗?
答案并不是,编译器并不能分辨他们是哪一种,只会进行他的操作,跟上面一样还是产生一个n的临时拷贝,用的这个临时拷贝传个ret

怎么优化?
我们想要优化一下这个,怎么优化?我们学习了引用,就是产生一个别名,我们可以通过改变别名来改变这个东西。
因为我们这里的n并不会被销毁,如果我们在返回的时候用引用。
这时我们还会像上面的操作一样产生一个临时变量,但是这个临时变量就不是我们的临时拷贝而是我们n的一个别名,我们如果想改变n,我们就可以通过改变返回值改变我们的n
int  count()
{static int n = 0;n++;return n;
}
int main()
{int ret = count();return 0;
}

这就是引用返回。

int&  count()
{static int n = 0;n++;return n;
}
int main()
{int ret = count();return 0;
}

什们场景下可以使用引用返回?

: 大家可能想到的是我们的静态变量,全局变量。结构体。
其实这些东西用一句话来说就是出了函数作用域,不被销毁的变量就可以。

引用返回的作用

通过上面的介绍我们知道了什们是引用返回,但是我们有这个有什么作用?我们什们情况下会用到这个。
那就看看下面这个例子。

#include<assert.h>
#define N 10typedef struct Array
{int a[N];int size;
}AY;//因为这个结构体在我们函数销毁完,我们还在所以可以用引用返回
int& PosAY(AY& ay, int i)
{assert(i < N);return ay.a[i];
}
int main()
{AY ay;//修改返回值for (int i = 0; i < N; i++){PosAY(ay, i) = i * 10;}//打印出来验证for (int i = 0; i < N; i++){cout << PosAY(ay, i) << " ";}return 0;
}
作用一
减少拷贝。
我们如果不用引用返回,那么我们在返回的时候我们要创建一个临时变量,将我们需要传的数据拷贝给临时变量。而我们的引用返回,直接将这个临时变量当作他的别名。
作用二
调用者可以修改返回对象
既然临时变量已经是我们要传的数据的别名,那么我们就可以修改返回对象来修改我们的数据。

下面我们在看一个例子

int& Add(int a, int b)
{int c = a + b;return c;
}
int main()
{int& ret = Add(1, 2);Add(3, 4);cout << "Add(1, 2) is :" << ret << endl;cout << "Add(1, 2) is :" << ret << endl;return 0;
}

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

这是一个错误的程序,我们这个函数,在我们出去了这个函数,函数就会被销毁,而我们c是一个局部变量,也就说明c在出来函数也被销毁。
但是我们在传返回值的时候我们传的是引用返回,我们传的是别名,这时ret就是别名,但是已经销毁了,我们的别名就已经没有意义。

有的同学就问,那我们第一次是7呢,是因为在vs编译器下,函数销毁并没有清理空间,我们访问可以找到。但是第二次已经处理了,所以我们就是随机值了。

常引用

我们先看例子。

int main()
{int a = 1;int& b = a;const int c = 2;//错误//int& d = c;
}

我们的指针和引用,在进行赋值和初始化,权限可以缩小,但是权限不能放大。
就是我们上面对于c来说,cconst修饰,是一个不可修改的变量。
但是呢我们用d引用c,尽然可以让d修改,进而改变c,这显然是不合法的。这时我们就能理解为什们权限不能放大。但是权限可以平移。

解决方法,就是在引用的时候也变成被const修饰的引用,让他变得不可修改。const int& d = c;

因为临时变量具有常性,大家看一下下面这个例子

int count()
{static int n = 0;n++;return n;
}
int main()
{int& ret = count();return 0;
}

上面这个代码大家千万不要以为这样可以,我们通过上面的讲解,并不是直接将我们的n返回,而是将我们的n拷贝给我们的临时变量。将其引用给ret涉及到权限的放大,这时万万不行的,所以我们的可以将ret也设置为常性。const int& ret = count();这样就可以了。

我们再看一个代码。

int main()
{int i = 10;//错误//double& dd = i;const double& d = i;return 0;
}

为什们第一个不可以,但是第二个可以呢?
原因就是我们在进行类型转换的时候,我们会产生一个临时变量,(为什们会产生临时变量呢?我们再传的时候并不是将i直接传给d,并不能改变i,而是产生一个临时变量,将他改变,然后再赋值在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。给d。)又因为我们的临时变量具有常性,我们就必须用const修饰。

引用和指针的区别

语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

引用和指针的不同点:

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体
  4. 没有NULL引用,但有NULL指针
  5. sizeof中含义不同引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节)
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全

内联函数

C++用const和枚举替换宏常量
C++用inline去替代宏函数

宏缺点
1.不能调试
2.没有类型安全的检查
3.有些常见很复杂,很容易函数,不容易掌握。
宏优点
  1. 增强代码的复用性。
  2. 提高性能。

内联函数既包括了宏的优点,也几乎去除了宏的缺点。
看一个例子感受内联函数的使用。
其实就是还是正常写我们的函数,再其前面加上inline,在编译阶段,会用函数体替换函数调用。

inline int Add(int x, int y)
{int z = x + y;return z;
}int main()
{int ret = Add(1, 2);cout << ret << endl;return 0;
}

内联函数的特型

1. inline是一种以空间换时间(空间指可执行程序)的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运 行效率。
2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建 议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

auto关键字

auto的作用
简化代码,自动识别类型。具体看下面代码
int main()
{int a = 0;auto b = a;auto c = &a;//typeid能看他是什们类型cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;
}

在这里插入图片描述

	auto b = a;auto c = &a;//其实下面这个跟上面这个没有区别//就是将限定死d是指针auto* d = &a;auto& f = a;

auto在同一行定义多个变量

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

void TestAuto() 
{auto a = 1, b = 2;auto c = 3, d = 4.0;  // 该行代码会编译失败,因为c和d的初始化表达式类型不同 
}

auto不能推导的场景

  1. auto不能作为函数的参数
    在这里插入图片描述
  2. auto不能直接用来声明数组
    在这里插入图片描述

范围for–语法糖

先看例子

int main()
{int a[] = { 1,2,3,4,5,5 };//我们平常遍历一边数组,我们用的就是for循环for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++){cout << a[i] << " ";}cout << endl;//那我们用语法糖//其实就是自己自动依次取数组中数据赋值给n对象,自动判定结束//for(int n : a)for (auto n : a){n *= 2;cout << n << " ";}cout << endl;
}

范围for只是自动依次取数组中数据赋值给n对象,自动判定结束
并不会改变数组的内容,他只是赋值。
如果想要改变数组的内容,我们就用引用,问题就可以很好的解决。

在这里插入代码片

指针空值nullptr

在C语言中,NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:

#ifndef NULL
#ifdef __cplusplus 
#define NULL    0 
#else
#define NULL    ((void *)0) 
#endif
#endif

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何 种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦
比如下面的代码,
结果是这样的
在这里插入图片描述

void f(int) 
{cout<<"f(int)"<<endl; 
}
void f(int*) 
{cout<<"f(int*)"<<endl; 
}
int main()
{f(0);f(NULL);f((int*)NULL); return 0;
}

所以C++使用一个关键字nullptr来解决这个麻烦

注意
  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的.
  1. 在C++11中,sizeof(nullptr)sizeof((void*)0)所占的字节数相同。
  1. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr

相关文章:

C++的入门

C的关键字 C总计63个关键字&#xff0c;C语言32个关键字 命名空间 我们C的就是建立在C语言之上&#xff0c;但是是高于C语言的&#xff0c;将C语言的不足都弥补上了&#xff0c;而命名空间就是为了弥补C语言的不足。 看一下这个例子。在C语言中会报错 #include<stdio.h>…...

数据的存储

类型的意义&#xff1a;使用这个类型开辟内存空间的大小&#xff08;大小决定了使用范围&#xff09;如何看待内存空间视角类型的基本归类整型家族浮点数家族构造类型指针类型空类型整型存储解构:整型在计算机中占用四个字节&#xff0c;整型分为无符号整型和有符号整型在计算机…...

Linux查看UTC时间

先了解一下几个时间概念。 GMT时间&#xff1a;Greenwich Mean Time&#xff0c;格林尼治平时&#xff0c;又称格林尼治平均时间或格林尼治标准时间。是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间。 GMT时间存在较大误差&#xff0c;因此不再被作为标准时间使用。现在…...

SpringBoot修改启动图标(详细步骤)

目录 一、介绍 二、操作步骤 三、介绍Java学习&#xff08;题外话&#xff09; 四、关于基础知识 一、介绍 修改图标就是在资源加载目录&#xff08;resources&#xff09;下放一个banner.txt文件。这样运行加载的时候就会扫描到这个文件&#xff0c;然后启动的时候就会显…...

【每日一题Day143】面试题 17.05. 字母与数字 | 前缀和+哈希表

面试题 17.05. 字母与数字 给定一个放有字母和数字的数组&#xff0c;找到最长的子数组&#xff0c;且包含的字母和数字的个数相同。 返回该子数组&#xff0c;若存在多个最长子数组&#xff0c;返回左端点下标值最小的子数组。若不存在这样的数组&#xff0c;返回一个空数组。…...

Go 内置运算符 if for switch

算数运算符fmt.Println("103", 103) //103 13 fmt.Println("10-3", 10-3) //10-3 7 fmt.Println("10*3", 10*3) //10*3 30 //除法注意&#xff1a;如果运算的数都是整数&#xff0c;那么除后&#xff0c;去掉小数部分&#xff0c;保留整数部分 f…...

C语言指针数组实际应用(嵌入式)

C语言指针数组详细学习 指针是C语言中非常重要的概念之一&#xff0c;它可以让我们直接访问内存中的数据。指针数组则是由多个指针组成的数组&#xff0c;每个指针都可以指向内存中的某个位置。以下是一些指针数组的实际代码应用&#xff1a; 字符串数组 char* names[] {&q…...

常用的Java注解详解

Java是一种常用的编程语言&#xff0c;而注解是Java语言中非常重要的一部分。在这篇文章中&#xff0c;我们将介绍一些常用的Java注解&#xff0c;以及它们的作用和使用方法。 Override override注解是用于表示一个方法是被覆盖的。在Java中&#xff0c;如果子类要覆盖父类的方…...

华为OD机试题 - 第 K 个最小码值的字母(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:第 K 个最小码值的字母题目输入输出示例一输入输出说明示例一输…...

vscode环境配置(支持跳转,阅读linux kernel)

目录 1.卸载clangd插件 2.安装C插件 3. 搜索框内输入 “intell”&#xff0c;将 C_Cpp&#xff1a;Intelli Sense Engine 开关设置为 Default。 4.ubuntu安装global工具 5.vscode安装插件 6.验证是否生效 7.建立索引 1.卸载clangd插件 在插件管理中卸载clangd插件 2.安…...

zigbee学习笔记:IO操作

1、IAR新建工程 &#xff08;1&#xff09;Projetc→Create New Projetc→OK→选择位置&#xff0c;确定 &#xff08;2&#xff09;新建一个c文件&#xff0c;保存在路径中 &#xff08;3&#xff09;点击工程&#xff0c;右键→add→加入c文件 &#xff08;4&#xff09;…...

华为OD机试题 - 最少数量线段覆盖(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:最少数量线段覆盖题目输入输出示例一输入输出说明Code解题思路版…...

python趣味编程-2048游戏

在上一期我们用Python实现了一个盒子追逐者的游戏&#xff0c;这一期我们继续使用Python实现一个简单的2048游戏&#xff0c;让我们开始今天的旅程吧~ 在 Python 免费源代码中使用 Tkinter 的简单 2048 游戏 使用 Tkinter 的简单 2048 游戏是一个用Python编程语言编码的桌面游…...

求解完全背包问题

题目描述实现一个算法求解完全背包问题。完全背包问题的介绍如下&#xff1a;已知一个容量为 totalweight 的背包&#xff0c;有不同重量不同价值的物品&#xff0c;问怎样在背包容量限制下达到利益最大化。完全背包问题的每个物品可以无限选用背包问题求解方法的介绍如下&…...

我们为什么使用docker 优点 作用

1. 我们为什么使用Docker? 当我们在工作中&#xff0c;一款产品从开发设计到上线运行&#xff0c;其中需要开发人员和运维工程师&#xff0c;开发人员负责代码编写&#xff0c;开发产品&#xff0c;运维工程师需要测试环境&#xff0c;产品部署。这之间就会有分歧。 就好比我…...

Python每日一练(20230311)

目录 1. 合并两个有序数组 2. 二叉树的右视图 3. 拼接最大数 &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 1. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2&#xff0c;请你将 nums2 合并到 nums1 中&#xff0c;使 nums1 成为…...

202109-3 CCF 脉冲神经网络 66分题解 + 解题思路 + 解题过程

解题思路 根据题意&#xff0c;脉冲源的阈值大于随机数时&#xff0c;会向其所有出点发送脉冲 神经元当v>30时&#xff0c;会向其所有出点发送脉冲&#xff0c;unordered_map <int, vector > ne; //存储神经元/脉冲源的所有出点集合vector 所有脉冲会有一定的延迟&am…...

Aurora简介

Amazon Aurora是一种兼容MySQL和PostgreSQL的商用级别关系数据库&#xff0c;它既有商用数据库的性能和可用性&#xff08;比如Oracle数据库&#xff09;&#xff0c;又具有开源数据库的成本效益&#xff08;比如MySQL数据库&#xff09;。 Aurora的速度可以达到MySQL数据库的…...

【python实操】用python写软件弹窗

文章目录前言组件label 与 多行文本复选框组件Radiobutton单选组件Frame框架组件labelframe标签框架列表框Listboxscrollbar滚动条组件scale刻度条组件spinbox组件Toplevel子窗体组件PanedWindow组件Menu下拉菜单弹出菜单总结针对组件前言 python学习之路任重而道远&#xff0…...

Ubuntu 常用操作

版本22.04 1、开启 root # 输入新密码 sudo passwd rootUbuntu以root账号登录桌面 默认情况是不允许用root帐号直接登录图形界面的。 Ubuntu 默认使用 GNOME&#xff0c;GNOME 使用 GDM 显示管理器。 为了允许以 root 身份登录到 GNOME&#xff0c;你需要对位于 ​​/etc/…...

井字棋--课后程序(Python程序开发案例教程-黑马程序员编著-第7章-课后作业)

实例2&#xff1a;井字棋 井字棋是一种在3 * 3格子上进行的连珠游戏&#xff0c;又称井字游戏。井字棋的游戏有两名玩家&#xff0c;其中一个玩家画圈&#xff0c;另一个玩家画叉&#xff0c;轮流在3 * 3格子上画上自己的符号&#xff0c;最先在横向、纵向、或斜线方向连成一条…...

谷粒学院开发(三):统一日志、异常及前端准备工作

特定异常处理 ControllerAdvice public class GlobalExceptionHandler {ExceptionHandler(Exception.class) // 指定出现什么异常会被处理ResponseBody // 为了能够返回数据public R error(Exception e) {e.printStackTrace();return R.error().message("执行了全局异常…...

华为OD机试题 - 招聘(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:招聘题目输入输出示例一输入输出说明示例二输入输出说明示例三输…...

关于SQL优化的几点说明

1. ORACLE DBA是如何进行SQL优化的 作为一个Oracle数据库管理员(DBA)&#xff0c;SQL优化是他们的日常工作之一&#xff0c;主要目标是优化查询性能&#xff0c;减少查询时间&#xff0c;并提高数据库的整体性能。 以下是Oracle DBA如何进行SQL优化的一般流程&#xff1a; 监控…...

使用高精度秒表StopWatch测试DateTime.Now的精度

StopWatch使用的命名空间&#xff1a;using System.Diagnostics;StopWatch的使用方法&#xff1a;创建Stopwatch对象&#xff1a;stopwatch&#xff1b;stopwatch计时表开启&#xff1a;stopwatch.Start();stopwatch计时表关闭&#xff1a;stopwatch.Stop();计算stopwatch.Stop…...

【C++】vector的使用及其模拟实现

这里写目录标题一、vector的介绍及使用1. vector的介绍2. 构造函数3. 遍历方式4. 容量操作及空间增长问题5. 增删查改6. vector二维数组二、vector的模拟实现1. 构造函数2. 迭代器和基本接口3. reserve和resize4. push_back和pop_back5. insert和erase5. 迭代器失效问题5. 浅拷…...

[洛谷-P2585][ZJOI2006]三色二叉树(树形DP+状态机DP)

[洛谷-P2585][ZJOI2006]三色二叉树&#xff08;树形DP状态机DP&#xff09;一、题目题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示数据规模与约定二、分析1、递归建树2、树形DP 状态机DP&#xff08;1&#xff09;状态表示&#xff08;2&#xff09;状态转移三、…...

BI技巧丨计算组

PowerBI有三大工具&#xff0c;分别是DAX Studio&#xff0c;Tabular Editor和Bravo。 DAX Studio通常我们会用来进行性能分析和DAX调优使用&#xff0c;Bravo一般用来批量格式化DAX&#xff0c;而Tabular Editor主要的功能就是计算组。 计算组这个名词&#xff0c;相信很多小伙…...

PMP项目管理项目范围管理

目录1 项目范围管理概述2 规划范围管理3 收集需求4 定义范围5 创建 WBS6 确认范围7 控制范围1 项目范围管理概述 项目范围管理包括确保项目做且只做所需的全部工作&#xff0c;以成功完成项目的各 个过程。管理项目范围主要在于定义和控制哪些工作应在项目内&#xff0c;哪些工…...

Flink 定时加载数据源

一、简介 flink 自定义实时数据源使用流处理比较简单&#xff0c;比如 Kafka、MQ 等&#xff0c;如果使用 MySQL、redis 批处理也比较简单 如果需要定时加载数据作为 flink 数据源使用流处理&#xff0c;比如定时从 mysql 或者 redis 获取一批数据&#xff0c;传入 flink 做处…...

ChatGPT、人工智能、人类和一些酒桌闲聊

© 2023 Conmajia Initiated 10th March, 2023 昨天跟某化学家喝酒&#xff0c;期间提到了 ChatGPT。他的评价是&#xff1a;这鬼东西大量输出毫无意义、错漏百出甚至是虚假的信息&#xff0c;“in a confident accent”。例如某次 GPT 针对“描述某某记者”这一问题&#…...

WebRTC开源库内部调用abort函数引发程序发生闪退问题的排查

目录 1、初始问题描述 2、使用Process Explorer工具查看到处理音视频业务的rtcmpdll.dll模块没有加载起来 3、使用Dependency Walker工具查看到rtcmpdll.dll依赖的库有问题 4、更新库之后Debug程序启动时就发生异常&#xff0c;程序闪退 5、VS调试时看不到有效的函数调用堆…...

Golang并发编程

Golang并发编程 文章目录Golang并发编程1. 协程2. channel2.1 channel的创建2.2 使用waitGroup实现同步3. 并发编程3.1 并发编程之runtime包3.2 mutex互斥锁3.3 channel遍历3.3.1 for if遍历3.3.2 for range3.4 select switch3.5 Timer3.5.1 time.NewTimer()3.5.2 Stop、reset…...

windows+Anaconda环境下安装BERT成功安装方法及问题汇总

前言 在WindowsAnaconda环境下安装BERT&#xff0c;遇到各种问题&#xff0c;几经磨难&#xff0c;最终成功。接下来&#xff0c;先介绍成功的安装方法&#xff0c;再附上遇到的问题汇总 成功的安装方法 1、创建虚拟环境 注意&#xff1a;必须加上python3.7.12以创建环境&a…...

git - 简易指南

git - 简易指南 创建新仓库 创建新文件夹&#xff0c;打开&#xff0c;然后执行 git init 以创建新的 git 仓库。 检出仓库 执行如下命令以创建一个本地仓库的克隆版本&#xff1a; git clone /path/to/repository 如果是远端服务器上的仓库&#xff0c;你的命令会是这个样…...

[论文笔记]Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context

引言 我们知道Transformer很好用&#xff0c;但它设定的最长长度是512。像一篇文章超过512个token是很容易的&#xff0c;那么我们在处理这种长文本的情况下也想利用Transformer的强大表达能力需要怎么做呢&#xff1f; 本文就带来一种处理长文本的Transformer变种——Transf…...

华为OD机试题 - 找目标字符串(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:找目标字符串题目输入输出示例一输入输出说明Code解题思路版权说…...

C++面向对象编程之六:重载操作符(<<,>>,+,+=,==,!=,=)

重载操作符C允许我们重新定义操作符&#xff08;例如&#xff1a;&#xff0c;-&#xff0c;*&#xff0c;/&#xff09;等&#xff0c;使其对于我们自定义的类类型对象&#xff0c;也能像内置数据类型&#xff08;例如&#xff1a;int&#xff0c;float&#xff0c;double&…...

JS_wangEditor富文本编辑器

官网&#xff1a;https://www.wangeditor.com/ 引入 CSS 定义样式 <link href"https://unpkg.com/wangeditor/editorlatest/dist/css/style.css" rel"stylesheet"> <style>#editor—wrapper {border: 1px solid #ccc;z-index: 100; /* 按需定…...

Django实践-06导出excel/pdf/echarts

文章目录Django实践-06导出excel/pdf/echartsDjango实践-06导出excel/pdf/echarts导出excel安装依赖库修改views.py添加excel导出函数修改urls.py添加excel/运行测试导出pdf安装依赖库修改views.py添加pdf导出函数修改urls.py添加pdf/生成前端统计图表修改views.py添加get_teac…...

java并发入门(一)共享模型—Synchronized、Wait/Notify、pack/unpack

一、共享模型—管程 1、共享存在的问题 1.1 共享变量案例 package com.yyds.juc.monitor;import lombok.extern.slf4j.Slf4j;Slf4j(topic "c.MTest1") public class MTest1 {static int counter 0;public static void main(String[] args) throws InterruptedEx…...

Ast2500增加用户自定义功能

备注&#xff1a;这里使用的AMI的开发环境MegaRAC进行AST2500软件开发&#xff0c;并非openlinux版本。1、添加上电后自动执行的任务在PDKAccess.c中列出了系统启动过程中的所有任务&#xff0c;若需要添加功能&#xff0c;在相应的任务中添加自定义线程。一般在两个任务里面添…...

用Python暴力求解德·梅齐里亚克的砝码问题

文章目录固定个数的砝码可称量重量砝码的组合方法40镑砝码的组合问 一个商人有一个40磅的砝码&#xff0c;由于跌落在地而碎成4块。后来&#xff0c;称得每块碎片的重量都是整磅数&#xff0c;而且可以用这4 块来称从1 至40 磅之间的任意整数磅的重物。问这4 块砝码片各重多少&…...

离散Hopfield神经网络的分类——高校科研能力评价

离散Hopfield网络离散Hopfield网络是一种经典的神经网络模型&#xff0c;它的基本原理是利用离散化的神经元和离散化的权值矩阵来实现模式识别和模式恢复的功能。它最初由美国物理学家John Hopfield在1982年提出&#xff0c;是一种单层的全连接神经网络&#xff0c;被广泛应用于…...

Retrofit核心源码分析(三)- Call逻辑分析和扩展机制

在前面的两篇文章中&#xff0c;我们已经对 Retrofit 的注解解析、动态代理、网络请求和响应处理机制有了一定的了解。在这篇文章中&#xff0c;我们将深入分析 Retrofit 的 Call 逻辑&#xff0c;并介绍 Retrofit 的扩展机制。 一、Call 逻辑分析 Call 是 Retrofit 中最基本…...

源码分析spring如和对@Component注解进行BeanDefinition注册的

Spring ioc主要职责为依赖进行处理&#xff08;依赖注入、依赖查找&#xff09;、容器以及托管的(java bean、资源配置、事件)资源声明周期管理&#xff1b;在ioc容器启动对元信息进行读取&#xff08;比如xml bean注解等&#xff09;、事件管理、国际化等处理&#xff1b;首先…...

C语言--字符串函数1

目录前言strlenstrlen的模拟实现strcpystrcatstrcat的模拟实现strcmpstrcmp的模拟实现strncpystrncatstrncmpstrstrstrchr和strrchrstrstr的模拟实现前言 本章我们将重点介绍处理字符和字符串的库函数的使用和注意事项。 strlen 我们先来看一个我们最熟悉的求字符串长度的库…...

Webstorm使用、nginx启动、FinalShell使用

文章目录 主题设置FinalShellFinalShell nginx 启动历史命令Nginx页面发布配置Webstorm的一些常用快捷键代码生成字体大小修改Webstorm - gitCode 代码拉取webstorm 汉化webstorm导致CPU占用率高方法一 【忽略node_modules】方法二 【设置 - 代码编辑 - 快速预览文档 - 关闭】主…...

源码分析Spring @Configuration注解如何巧夺天空,偷梁换柱。

前言 回想起五年前的一次面试&#xff0c;面试官问Configuration注解和Component注解有什么区别&#xff1f;记得当时的回答是&#xff1a; 相同点&#xff1a;Configuration注解继承于Component注解&#xff0c;都可以用来通过ClassPathBeanDefinitionScanner装载Spring bean…...

vector的使用及模拟实现

目录 一.vector的介绍及使用 1.vector的介绍 2.vector的使用 1.vector的定义 2.vector iterator的使用 3. vector 空间增长问题 4.vector 增删查改 3.vector 迭代器失效问题&#xff08;重点&#xff09; 1. 会引起其底层空间改变的操作 2.指定位置元素的删除操作--erase 3. Li…...