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

《深入探究:C++ 在多方面对 C 语言实现的优化》

目录

  • 一、C++ 在 C 上进行的优化
  • 二、C++ 关键字(C++ 98)
  • 三、C++ 的输入输出
    • 1. cin 和 cout 的使用
    • 2. cin、cout 和 scanf()、printf() 的区别
  • 三、命名空间
    • 1. 命名空间的使用
    • 2. 嵌套命名空间
    • 3. 在多个头文件中使用相同的命名空间
  • 四、函数缺省值
    • 1. 缺省值的使用
    • 2. 缺省值使用的注意事项
  • 五、函数重载
    • 1. 函数重载的使用
    • 2. 为什么函数返回类型不同不算函数重载?
  • 六、引用
    • 1. 引用的使用
    • 2. 常量引用
    • 3. 常量引用和普通引用的区别
    • 5. 引用传参
    • 6. 引用的注意事项
  • 七、内联函数
    • 1. 内联函数的使用
    • 2. 内联函数的注意事项
    • 3. 宏的优缺点?C++ 有哪些技术替代宏?
  • 八、auto 关键字
    • 1. auto 关键字的使用
    • 2. auto 关键字使用的注意事项
  • 九、基于范围的 for 循环
    • 1. 范围 for 的使用
    • 2. 范围 for 的使用条件
  • 十、空指针 nullptr(C++11)

一、C++ 在 C 上进行的优化

  C++ 在 C 的基础上加入了面向对象编程、泛型编程和许多有用的库。弥补了 C 语言的不足,并对 C 语言不合理的地方进行优化,使其更加适应当前时代的需求和发展。

  由于 C++ 兼容大部分的 C,所以可以在 C++ 中混合使用 C 来进行编写代码,如使用 printf() 函数和 scanf() 函数。

二、C++ 关键字(C++ 98)

  下面的关键字看看就行,不用背,用的多了就记住了,很多都是 C 语言学过的。
在这里插入图片描述

三、C++ 的输入输出

  在 C++ 中,输入输出被看成输入流和输出流,使用 iostream 库中的 istream 和 ostream 分别表示输入流和输出流。标准输入就可以理解为把键盘敲击输入的信息放入输入流中,而标准输出就可以理解为把输出的信息放入输出流中,随着输出流显示到显示器上。一个流就是一个字符。术语 “流” 的意思是,随着时间的推移,字符是顺序生成或者消耗的。

  而标准库定义了名为 cin 的 istream 类的对象和名为 cout 的 ostream 类的对象并通过流插入运算符(<<)和流提取运算符(>>)用来处理标准输入和标准输出。cin 和 cout 均可智能识别其后数据的类型。

1. cin 和 cout 的使用

  首先,使用 cin 和 cout 输入输出对象需要完成下面两步:
1)包含 iostream 库,因为 istream 类和 ostream 类包含在 iostream 库中。
2) 使用标准命名空间 std,或者单独声明 cin 和 cout。

// 头文件
#include <iostream>// 使用标准命名空间 std
using namespace std;int main()
{int i = 0;double d = 0;char c = 0;// 输入cin >> i;  // 单个变量输入cin >> d >> c;  // 多个变量连续输入// 输入cout << "i = " << i << endl;cout << "d = " << d << endl;cout << "c = " << c << endl;return 0;
}

  在上述代码中,流提取运算符(>>)搭配 cin 使用,流插入运算符(<<)搭配 cout 使用,后面跟需要输入和输出的数据即可。也可以连续输入和输出,因为 cin 和 cout 在输入和输出完成第一个数据之后会返回一个类对象的引用。连续输入只要中间间隔空白(空格、制表符和换行符)即可。

  endl 是 C++ 的操纵符,把它写入标准输出流的作用是换行并刷新缓冲区。

  代码运行结果如下:
在这里插入图片描述

2. cin、cout 和 scanf()、printf() 的区别

1)cin、cout 是类对象,而 scanf() 和 printf() 是函数;
2)cin、cout 使用流插提取运算符(>>)和流插入运算符(<<)来进行输入和输出,scanf() 和 printf() 使用参数传递的方式来进行输入和输出;
3)cin、cout 适用于非格式化输入和输出,scanf() 和 printf() 适合格式化输入和输出。

三、命名空间

  当我们包含库中的头文件时,由于该头文件中的内容过多,很容易和我们自己命名的名称冲突。当我们和他人一起编写大型项目时,我们和他人命名的名称也很容易冲突。

  上面的问题放在 C 语言中,只能使用不同的名称,而在 C++ 中可以通过使用关键字 namespace 创建命名空间来解决。

1. 命名空间的使用

  创建命名空间的格式为:namespace 名称 { … }

// 头文件
#include <iostream>// 使用标准名称空间
using namespace std;// 创建命名空间 qcx
namespace qcx
{int a = 3;// 交换函数void Swap(int* a, int* b){int tmp = *a;*a = *b;*b = tmp;}
}// 交换函数
void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}int a = 2;int main()
{int a = 1;cout << "局部变量: " << a << endl;cout << "全局变量: " << ::a << endl;cout << "命名空间: " << qcx::a << endl;return 0;
}

  上述代码运行结果如下:
在这里插入图片描述
  可以看到,代码正常运行。且在上述代码中,出现了三个同名变量 a,和两个一模一样的函数,倘若这放在 C 语言中,编译阶段就已经报错了。

  第一条 cout 语句中的变量 a 是局部变量,当全局变量名和局部变量名冲突时,局部优先,且编译器在使用变量名时,会先在局部查找,然后在全局查找,不会主动访问命名空间的内容。第二条 cout 语句中的变量 a,使用 C++ 中的作用域解析运算符(::),当该运算符的左侧为空白时,默认访问全局变量。第三条 cout 语句,使用作用域解析运算符(::)显示访问命名空间 qcx 中的变量 a。

  名称冲突是在同一个作用域中出现了同名的变量或者函数,而命名空间的作用是开辟一个新的作用域,所以上述代码中的三个 a 变量的作用域分别为:局部作用域,全局作用域,命名空间作用域,所以不会造成命名冲突。

(1)为什么包含头文件 iostream 后还需要使用标准命名空间 std ?
  在学习 C 语言的时候,包含的头文件在编译阶段就直接展开了,且该头文件包含的内容可以直接使用。

  但是,C++ 把标准库中的内容全部封装到了标准命名空间 std 中,比如现在包含头文件 iostream 相当于包含了如下内容:
namespace std
{
   iostream 文件的内容
}

  就像我们前面说的,编译器是不会主动访问命名空间中的内容的,所以如果仅仅只包含该头文件,我们是不能去使用里面的工具的。

  而语句 using namespace std; 的作用是把外面的 namespace std 去掉,把里面的内容显示出来,也就相当于学习 C 语言时的包含头文件。

  但是,如果直接使用 using namespace std,不就相当于命名空间白用了?把头文件中的内容全部展开和 C 语言不就没有区别了?所以,C++ 还提供了把命名空间里面的单个工具展开,如:using std::cout;,把 cout 类对象放入全局,这样我们就可以使用 cout 工具,且不用担心名称冲突了。

  当然如果不嫌麻烦,也可以显示访问命名空间 std,如:std::cout << qcx::a << std::endl;。

(2)命名空间中可以存放变量、结构体、函数、类等内容

2. 嵌套命名空间

  嵌套命名空间就是一个命名空间里面再包含命名空间,和嵌套循环一个意思。这个很容易理解,比如我们制作一款游戏,那么把战斗模块和数值模块分的代码放入各自的命名空间,然后战斗模块的每个组的代码放入各自的命名空间,最后每个组的成员的代码又放入各自的命名空间。

  具体效果类似如下代码:

// 游戏
namespace game
{// 战斗模块namespace Battle{// a 组namespace a{// 小王namespace wang{// 代码...}// 小张namespace zhang{// 代码...}}// b 组namespace b{// 小王namespace wang{// 代码...}// 小张namespace zhang{// 代码...}}}// 数值模块namespace Numerical{// a 组namespace a{// 小王namespace wang{// 代码...}// 小张namespace zhang{// 代码...}}// b 组namespace b{// 小王namespace wang{// 代码...}// 小张namespace zhang{// 代码...}}}
}

  如果需要访问战斗模块 a 组小王的变量 age,可以使用如下方法:
1)using Game::Battle:: a::wang::age;
2)using namespace Game::Battle:: a::wang;
(上面 a 前面加个空格是CSDN防止格式化)

3. 在多个头文件中使用相同的命名空间

  比如在头文件 head1 中创建命名空间 qcx,然后在头文件 head2 中创建命名空间 qcx,那么这两个命名空间会合并为一个命名空间。如果在这两个头文件的 qcx 命名空间中定义了相同的名称,编译器会报错。
在这里插入图片描述

四、函数缺省值

  函数缺省值的作用是不给函数传递参数时,函数使用默认值。在创建顺序表时,通常我们需要传递一个参数来初始化顺序表的大小,但是有时又不确定这个值给多大,给大了浪费空间,给小了需要扩容。所以可以给一个缺省值。

1. 缺省值的使用

// 头文件
#include <iostream>
#include <stdlib.h>// 使用声明
using std::cout;
using std::endl;// 类型声明
typedef int DataType;// 顺序表
struct SQList
{DataType* pdata;size_t size;size_t capacity;
};// 初始化顺序
void InitSQList(SQList* sl, int capacity = 2)
{// 申请空间sl->pdata = (DataType*)malloc(sizeof(DataType) * capacity);if (nullptr == sl->pdata){perror("InitSQList::malloc: ");return;}// 初始化成员sl->size = 0;sl->capacity = capacity;
}// 获得顺序表的容量
size_t GetCapacity(SQList* sl)
{return sl->capacity;
}int main()
{// 创建顺序表SQList s1, s2;// 使用缺省参数InitSQList(&s1);// 传递参数InitSQList(&s2, 8);// 打印容量cout << "s1 的容量:" << GetCapacity(&s1) << endl;cout << "s2 的容量:" << GetCapacity(&s2) << endl;return 0;
}

  可以看到程序的运行结果如下:在这里插入图片描述

2. 缺省值使用的注意事项

(1)函数声明填写缺省值,函数定义不写
  这样做的好处是防止两边对不上,其次编译阶段需要检查函数声明,如果函数声明不写,函数定义写的话,编译阶段就会报错。

(2)函数缺省值需要从右往左依次填写
  由于函数传参是从左到右依次传递的,所以函数缺省值需要从右往左依次缺省。因为C++在传递参数的时候不允许有参数为空。

(3)所有参数都有缺省值叫全缺省,部分参数有缺省值叫班缺省

五、函数重载

  函数重载顾名思义就是在相同的作用域中可以存在两个相同名称的函数。这放在 C 中是不允许的,因为 C 中识别函数主要是通过函数名来识别的,而C++中加上了参数。

  举个简单的例子,就拿函数 void Swap(int a, int b) 来说,在 C 语言中可能就是通过 Swap 来识别,但是在 C++ 中,是通过 Swapii,来识别,后面的 ii 代表了两个 int 参数。

  所以,C++ 支持函数重载,只要函数的参数数量、类型和顺序不同即可。(上述只是简单说明,编译器具体的识别肯定不想上述这么简单)

1. 函数重载的使用

// 头文件
#include <iostream>// 使用声明
using std::cout;
using std::endl;// 交换函数
void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}void Swap(double* a, double* b)
{double tmp = *a;*a = *b;*b = tmp;
}int main()
{int a = 1, b = 2;Swap(&a, &b);cout << "a = " << a << endl;cout << "b = " << b << endl;double c = 1.1, d = 2.2;Swap(&c, &d);cout << "c = " << c << endl;cout << "d = " << d << endl;return 0;
}

  程序运行结果如下:
在这里插入图片描述
&esmp; 可以看到通过使用函数重载,可以把一个函数的功能作用到不同类型的变量上。

2. 为什么函数返回类型不同不算函数重载?

  如果两个函数仅仅只是函数返回值不同,那么在编译截断就会报错,由于函数调用语句一模一样,编译器不知道你想调用哪个函数。

六、引用

  引用的作用是给已经存在的变量取一个别名,也就是引用变量和被引用的变量共用一块空间。

  创建引用变量的格式为:类型 &引用变量名 = 被引用的变量名

1. 引用的使用

// 头文件
#include <iostream>// 使用声明
using std::cout;
using std::endl;int main()
{// 创建变量 aint a = 10;// b 是对 a 的引用,也就是 b 是 a 的别名int& b = a;// 值验证cout << "a = " << a << endl;cout << "b = " << b << endl;// 地址验证cout << "&a = " << &a << endl;cout << "&b = " << &b << endl;return 0;
}

  程序的运行结果如下:
在这里插入图片描述
  可以看到上述变量 a 和 变量 b 的值和地址均相同,可以得出它们都是代指同一块空间。就好像一个人拥有外号,如李逵又叫黑旋风,但是叫的都是同一个人。而引用所代表的就是这种关系。如下图所示:
在这里插入图片描述

2. 常量引用

  常量引用相比于普通引用的区别就是其值不能修改,类似 const 变量和普通变量。

// 头文件
#include <iostream>// 使用声明
using std::cout;
using std::endl;int main()
{int a = 10;// 普通引用int& ra = a;ra = 1;cout << "a = " << a << endl;return 0;
}

  普通引用可以修改:
在这里插入图片描述
  常量引用不能修改:
在这里插入图片描述
  从上述代码以及运行结果中可以看出,常量引用不能修改只能读取,普通引用既能修改又能读取。

3. 常量引用和普通引用的区别

1)常量引用既能引用常量又能引用变量,而普通引用只能引用变量。
在这里插入图片描述
在这里插入图片描述
2)常量引用不能修改,普通引用可以修改

5. 引用传参

  引用传参非常好用,首先引用传参效率高,因为直接使用原对象,其次引用传参节省空间,因为引用和引用对象共用一块空间。

  下面是使用引用传参的 Swap() 函数:

// 头文件
#include <iostream>// 使用声明
using std::cout;
using std::endl;// 交换函数
void Swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}int main()
{int a = 10;int b = 20;// 交换前cout << "交换前:\n";cout << "a = " << a << endl;cout << "b = " << b << endl;// 交换后Swap(a, b);cout << "交换后:\n";cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;
}

  代码运行结果如下:
在这里插入图片描述
  可以看到引用传参比指针传参还要香,不仅传参直接传递,在函数中也可以直接使用。而指针传参需要取地址,在函数中还需要解引用。

  而且引用还可以作为返回值,其他类型作为返回值都需要先拷贝到一个临时对象,然后再返回,而引用作为返回值是直接返回,提升了效率。但是引用作为返回值不能返回局部变量。

6. 引用的注意事项

1)引用必须在初始化时绑定对应类型的对象,且绑定之后不能转换绑定对象;
2)引用不开辟空间,和被引用对象共用一块空间;
3)普通引用只能绑定变量,常量引用没有限制;
4)函数不能返回局部变量的引用;
5)传参时如果不需要修改值,传递常量引用,避免不小心修改;
6)不要把引用和指针混淆。

七、内联函数

  函数调用需要建立栈帧,但是如果该函数仅仅只有寥寥几行代码,这样每次调用该函数的开销主要在建立栈帧上了。

  C 语言通过宏来解决上述问题,如下代码:

// 头文件
#include <iostream>// 使用声明
using std::cout;
using std::endl;// 宏声明
#define Add(x, y) (((x) + (y)) * 10)int main()
{cout << Add(10, 20) << endl;return 0;
}

通过上述代码可以发现,虽然宏能解决这个问题。但是宏是在编译过程中直接替换的,也不进行类型检查,且写法复杂,又由于运算符优先级要在表达式的每个部分加上括号。

  C++ 通过内联函数解决上述问题,直接在函数前面加上 inline 即可。内联函数的作用是,当运行到函数调用语句时,直接展开函数体,也就是用函数体替换函数调用语句。

1. 内联函数的使用

// 头文件
#include <iostream>
#include "head1.h"// 使用声明
using std::cout;
using std::endl; 宏声明
//#define Add(x, y) (((x) + (y)) * 10)int main()
{ 宏声明//cout << Add(10, 20) << endl;// 内联函数Add(10, 20);  // 相当于 return (10 + 20) * 10;return 0;
}

内联函数相当于在函数调用语句处展开函数体(带入参数值)。

2. 内联函数的注意事项

1)online 关键字只能添加在函数声明;
2)添加 online 关键字只是建议编译器让该函数成为内联函数,具体还需要编译器自行判断;
3)一般把内联函数直接定义在头文件中,其他文件需要使用只需要包含该头文件即可;
4)长度过长的函数和递归函数不适合成为内联函数,
5)内联函数只在 release 下起作用,在 debug 下不起作用;
6)内联函数不建议声明和定义分离,因为 inline 展开了,就找不到函数地址了,链接错误。

3. 宏的优缺点?C++ 有哪些技术替代宏?

(1)
优点:
1)针对不带参宏,提升了代码的可读性和可维护性;
2)针对带参宏,减少了函数栈帧的开销,提升了效率。

缺点:
1)缺少类型检查;
2)针对带参宏,可读性差,可维护性差,容易用错(由于运算符的优先级,必须在表达式的每个部分加上括号)

(2)
1)C++ 使用关键字 const 来定义常量;
2)C++ 使用内联函数替换带参宏。

八、auto 关键字

  auto 关键字的作用是在创建变量的时候根据赋值表达式的类型推断出变量的类型。

  当变量的类型复杂时,使用 auto 关键字非常方便且不易出错。

1. auto 关键字的使用

// 头文件
#include <iostream>// 使用声明
using std::cout;
using std::endl;int main()
{auto a = 1;  // intauto b = 1.1;  // doubleauto c = 'a';  // char auto d = "aaaaa";  // const char*auto e = 1 + 1.1;  // doublereturn 0;
}

从上述代码中的最后一条 auto 赋值语句中可以得出,auto 语句是根据表达式的值进行类型推断的。

2. auto 关键字使用的注意事项

1)在早期的 C/C++ 中,auto 关键字修饰的变量是具有自动存储器的局部变量。由于在函数中默认创建的变量就是局部变量,所以导致该关键字几乎没人使用。所以,C++11 标准赋予该关键字根据赋值表达式推断类型的能力。
2)使用 auto 关键字必须对变量初始化,因为 auto 关键字需要根据表达式的类型来推断该变量的类型。因此 auto 并非是一种类型声明,而是一个类型声明时的占位符,编译器在编译器会把 auto 替换为该变量对应的类型。
3)用 auto 声明指针类型时,使用 auto 和 auto* 没有任何区别,只是后者显示表示该类型是个指针。
4)用 auto 声明引用类型时必须使用 auto&。
5)使用 auto 在一行定义多个变量时,这些变量的基本类型必须相同。如:int、int*、int&,它们的基本类型都是 int。
6)auto 不能用来作为函数参数,也不能直接用来声明数组。

九、基于范围的 for 循环

  范围 for 是 C++11 新增的一种遍历方法,for 后面的圆括号被冒号(:)分为两部分,前者是范围内用于迭代的变量,后者是被迭代的范围。

  迭代的变量被依次赋予迭代范围中的值,所以正常情况下只能读取数据,就相当于把范围中的值依次拷贝到迭代的变量中。所以一般情况下使用引用,这样既减少了拷贝的环节,又可以修改范围中的数据。当只需要读取数据时,前面加上 const 即可。

1. 范围 for 的使用

// 头文件
#include <iostream>// 使用声明
using std::cout;
using std::endl;// 常量声明
const int SIZE = 10;int main()
{int arr[SIZE];for (int i = 1; i <= 10; ++i)arr[i - 1] = i;// 使用范围 for 变量数组for (auto& elem : arr){cout << elem << " ";elem *= 2;}cout << endl;for (auto& elem : arr)cout << elem << " ";return 0;
}

  代码的运行结果如下:
在这里插入图片描述
  与普通的循环一样,可以使用 continue 或者 break 跳出循环。

2. 范围 for 的使用条件

1)迭代的范围必须是确定的,如数组就是第一个元素到最后一个元素;
2)迭代的对象要实现++和==的操作。(范围 for 的本质是迭代器)

十、空指针 nullptr(C++11)

  在 C 语言中,空指针使用 NULL 表示。但是在 C++ 中,NULL 是一个宏,即 #define NULL 0。所以它的本质是数字 0,而在 C++ 中,关键字 nullptr 代表空指针。如下代码:

// 头文件
#include <iostream>// 使用声明
using std::cout;
using std::endl;// 函数定义
void func(int)
{cout << "func1(int)" << endl;
}void func(int*)
{cout << "func2(int*)" << endl;
}int main()
{func(0);func(NULL);func(nullptr);
}

  代码运行结果如下:
在这里插入图片描述

  可以看到当函数重载既有 int 参数又有指针参数时,NULL 会优先使用 int 参数的函数。所以在 C++ 中,尽量使用 nullptr 作为空指针。

 &esmp;首先,nullptr 是 C++ 的关键字,使用时不需要包含头文件。且在 C++11 中,sizeof(nullptr) 和 sizeof((void*)0) 的结果相同。

相关文章:

《深入探究:C++ 在多方面对 C 语言实现的优化》

目录 一、C 在 C 上进行的优化二、C 关键字&#xff08;C 98&#xff09;三、C 的输入输出1. cin 和 cout 的使用2. cin、cout 和 scanf()、printf() 的区别 三、命名空间1. 命名空间的使用2. 嵌套命名空间3. 在多个头文件中使用相同的命名空间 四、函数缺省值1. 缺省值的使用2…...

KeepAlive与RouterView缓存

参考 vue动态组件&#xff1c;Component&#xff1e;与&#xff1c;KeepAlive&#xff1e; KeepAlive官网介绍 缓存之keep-alive的理解和应用 Vue3Vite KeepAlive页面缓存问题 vue多级菜单(路由)导致缓存(keep-alive)失效 vue3 router-view keeperalive对于同一路径但路径…...

pyparsing restOfLine

在 pyparsing 中&#xff0c;restOfLine 是一个解析器&#xff08;parser&#xff09;&#xff0c;用于匹配当前位置到行尾的所有内容&#xff0c;通常在解析文件或处理逐行数据时非常有用。 restOfLine 的特性 匹配内容&#xff1a;从当前位置一直匹配到换行符 \n 或字符串结…...

回型矩阵:JAVA

解题思路&#xff1a; 通过定义四条边界&#xff1b;top,left,right,bottom,来循环&#xff0c;当top>bottom&&left>right的时候循环终止 循环结束的条件&#xff1a; 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述…...

React自学:如何使用localStorage,以及如何实现删除笔记操作

1. 初始化notes 以下这段代码完成了这些操作&#xff1a; 调用 localStorage.getItem("notes") 从浏览器的本地存储中获取名为 “notes” 的数据。使用 JSON.parse 将获取到的字符串解析成数组。如果本地存储中没有 “notes” 数据&#xff08;返回值为 null&#…...

【CSS in Depth 2 精译_079】第 13 章:渐变、阴影与混合模式概述 + 13.1:CSS 渐变效果(上)——使用多个颜色节点

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 13 章 渐变、阴影与混合模式】 ✔️ 13.1 渐变 ✔️ 13.1.1 使用多个颜色节点&#xff08;上&#xff09; ✔️13.1.2 颜色插值方法&#xff08;中&#xff09;13.1…...

汽车供应链 “剧变”开始,“智能感知潜在龙头”诞生

智能汽车产业链“剧变”已经开启&#xff0c;智能感知软硬件能力的权重正在不断被放大。 比如满足高阶泊车的第二代AK2超声波传感器、满足人机共驾场景需求的电子外后视镜&#xff08;CMS&#xff09;、iTOF 3D成像视觉感知&#xff08;用于舱内监控&#xff09;等新产品&…...

3大Excel免费功能

推荐几个免费excel图表绘制工具 Power Map Power Map是Excel的内置功能 Power Map可在Windows用户的Excel 2013或者Excel 2016或者Office 365中使用,如下图, 看案例 动态地图1 动态地图2...

linux centos 7 安装 mongodb7

MongoDB 是一个基于文档的 NoSQL 数据库。 MongoDB 是一个文档型数据库&#xff0c;数据以类似 JSON 的文档形式存储。 MongoDB 的设计理念是为了应对大数据量、高性能和灵活性需求。 MongoDB使用集合&#xff08;Collections&#xff09;来组织文档&#xff08;Documents&a…...

docker 安装 mongo 命令

## 拉取 MongoDB 镜像docker pull mongo:latest## 挂载文件目录&#xff1a;mkdir -p /usr/local/mongo/configmkdir -p /usr/local/mongo/datamkdir -p /usr/local/mongo/logstouch /usr/local/mongo/config/mongod.confchmod 777 /usr/local/mongo## 配置文件##vim …...

问题记录:CH592 PB6/PB10中断输入,无法从掉电模式唤醒

问题描述&#xff1a; PB6上拉输入&#xff0c;连接按键 PB10上拉输入&#xff0c;连接外部充电芯片状态管脚。不充电时开漏输出&#xff0c;充电时低电平 配置PB6和PB10为上拉输入&#xff0c;下降沿触发中断&#xff0c;然后进入掉电模式 理论上&#xff1a; PB6按键触发…...

搭建分布式Spark集群

title: 搭建分布式Spark集群 date: 2024-11-29 12:00:00 categories: - 服务器 tags: - Spark - 大数据搭建分布式Spark集群 本次实验环境&#xff1a;Centos 7-2009、Hadoop-3.1.4、JDK 8、Zookeeper-3.6.3、scala-2.11.5、Spark-3.2.1 功能规划 MasterSlave1Slave2主节点…...

BTP Integration Suite CPI Apache Camel

官网文档&#xff1a; https://help.sap.com/docs/integration-suite/sap-integration-suite/what-is-sap-integration-suite CPI 云集成(CPI)有以下几个特性&#xff1a; SAP Cloud Integration通过消息交换支持端到端流程集成。 它基于Apache软件基金会的开源框架Camel。 …...

Vue-Form-Making:Star5.5k,一款强大的Vue表单设计器,适用于低代码平台、自定义表单

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 Vue-Form-Making是一个开源的Vue表单设计器&#xff0c;它允许用户通过拖拽方式快速生成表单&#xff0c;支持多种表单组件和布局。 核心功能 1. 拖拽…...

使用 Vite 和 Redux Toolkit 创建 React 项目

文章目录 1. 创建 React 项目2. 安装依赖3. 创建状态仓库user.js创建 shopSlice 4. 在状态仓库中合并切片5. 在入口文件中导入并使用 store6. 获取切片中的数据7. 修改数据结尾 在本教程中&#xff0c;我们将通过使用 Vite 创建一个 React 项目&#xff0c;并结合 Redux Toolki…...

jmeter连接mysql

查询mysql数据库版本 SELECT VERSION(); 下载jmeter mysql 驱动jar包&#xff0c;版本低于mysql版本&#xff0c;放在jmeter的lib 路径下 MySQL :: Download MySQL Connector/J (Archived Versions) 添加JDBC Connection Configuration 填写 variable name 及数据库信息 注意…...

sql中case when若条件重复 执行的顺序

sql case when若条件重复 执行的顺序 在 SQL 中&#xff0c;如果你在 CASE 表达式中定义了多个 WHEN 子句&#xff0c;并且这些条件有重叠&#xff0c;那么 CASE 表达式的执行顺序遵循以下规则&#xff1a; &#xff08;1&#xff09;从上到下&#xff1a;SQL 引擎会按照 CASE …...

代码随想录算法训练营第五十天 | 图 | 并查集

Day 50 总结 自己实现中遇到哪些困难今日收获&#xff0c;记录一下自己的学习时间 15:00 - 16:0018:00 - 19:45 图论 深度收缩 & 广度搜索 BFS, DFS, visited数组, 四个方向并查集 数组代表链表, 用集合中的一个元素代表集合的根最小生成树拓扑排序最短路径算法 图论基…...

tryhackme——Pre Security(安检前)-Offensive Security(进攻性安全)

这里我用的edge的插件闪击翻译。这里我英语不好&#xff0c;所以用这个可以顺便学习下英语。 任务一&#xff1a;What is Offensive Security?&#xff08;什么是进攻性安全?&#xff09; 很简单啊&#xff0c;通过阅读&#xff0c;知道以下哪个选项更能代表您模拟黑客操作…...

vue iframe进行父子页面通信并切换URL

使用通义千问提问后得到一个很好的示例。 需求是2个项目需要使用同一个面包屑进行跳转&#xff0c;其中一个是iframe所在的项目&#xff0c;另一个需要通过地址访问。通过 window.parent.postMessage &#xff0c;帮助 <iframe> 内嵌入的子页面和其父页面之间进行跨域通…...

Cesium 无人机航线规划(区域航线)

区域航线&#xff0c;即划定一片区域一键巡查 这里选择点几个点&#xff0c;形成的区域内计算规划航线...

[NOIP2016 普及组] 海港 -STL-队列queue

[NOIP2016 普及组] 海港 题目背景 NOIP2016 普及组 T3 题目描述 小 K 是一个海港的海关工作人员&#xff0c;每天都有许多船只到达海港&#xff0c;船上通常有很多来自不同国家的乘客。 小 K 对这些到达海港的船只非常感兴趣&#xff0c;他按照时间记录下了到达海港的每一…...

前端页面导出word

html-docx-js bug: vite使用html-docx.js会报错&#xff0c;点击下载上方文件替换即可 正文 npm install html-docx-js -S npm install file-saver -S<template><div id"managerReport">word内容......</div> </template><script>&l…...

C++中的深拷贝和浅拷贝

浅拷贝 浅拷贝&#xff1a;就是简单的赋值操作。 浅拷贝问题&#xff1a;如果有指针指向堆区内存时&#xff0c;不同对象的指针成员指向同一块堆区内存&#xff0c;当对象释放时&#xff0c;该堆区内存会被释放两次。当一个对象修改堆区内存是&#xff0c;另一个对象也随之变…...

MobileLLM开发安卓AI的体验(一)

MobileLLM是一个在安卓端跑的大语言模型&#xff0c;关键它还有调动api的能力 https://github.com/facebookresearch/MobileLLM 项目地址是这个。 看了下&#xff0c;似乎还是中国人团队 article{liu2024mobilellm, title{MobileLLM: Optimizing Sub-billion Parameter Langua…...

MySQL的并发控制与MVCC机制深度解析

目录 1. MySQL中的并发问题2. 数据库的隔离级别3. MVCC&#xff08;多版本并发控制&#xff09;机制3.1 MVCC的实现原理3.2 Read View详解3.3 当前读与快照读 4. MVCC在不同隔离级别下的工作方式5. MVCC解决幻读问题6. MVCC的优缺点优点&#xff1a;缺点&#xff1a; 7. MVCC在…...

搭建Tomcat(六)---Response的实现

目录 引入 一、前端项目容器的搭建 重建项目: 1.创建一个新的项目&#xff1a; 2.创建HTML文件 3.将先前编写的所有tomcatJava文件挪过来 二、配置java文件 1.重启一下MyTomcat 2.配置两个工具包 ①FileUtil ②ResponseUtil&#xff08;响应头&#xff09; 三、处理…...

深度学习物体检测之YOLOV5源码解读

V5比前面版本偏工程化,项目化,更贴合实战 一.V5版本项目配置 (1)整体项目概述 首先github直接查找yolov5&#xff0c;下载下来即可。在训练时&#xff0c;数据是怎么处理的&#xff1f;网络模型架构是怎么设计的(如各层的设计)&#xff1f;yolov5要求是大于python3.8与大于等…...

Ubuntu22.04配置3D gaussian splatting

这篇博客提供了3D gaussian splatting在新安装Ubuntu上的配置过程。 1.拉仓库 2.安装显卡驱动和cuda版本 3.安装Pytorch 4.安装Pycharm和配置Python 5.安装附加依赖项&#xff08;方法一&#xff09; 6.安装Anaconda&#xff08;方法二&#xff09; 7.测试 1.拉仓库 # HT…...

【Python知识】python基础-关于异常处理

python的异常处理知识 概览基本用法自定义异常捕获特定异常信息 异常抛出 概览 在Python中&#xff0c;异常处理是通过try、except和finally等关键字来实现的。这些关键字允许你捕获和处理在程序运行时可能出现的错误和异常情况&#xff0c;从而避免程序崩溃&#xff0c;并允许…...

golang 使用gzip对json例子

package main import ( "bytes" "compress/gzip" "encoding/json" "fmt" "io" "log" ) // User 结构体定义 type User struct { ID int json:"id" Name string json:"name" Age in…...

qt-C++笔记之自定义类继承自 `QObject` 与 `QWidget` 及开发方式详解

qt-C笔记之自定义类继承自 QObject 与 QWidget 及开发方式详解 code review! 参考笔记 1.qt-C笔记之父类窗口、父类控件、对象树的关系 2.qt-C笔记之继承自 QWidget和继承自QObject 并通过 getWidget() 显示窗口或控件时的区别和原理 3.qt-C笔记之自定义类继承自 QObject 与 QW…...

利用git上传项目到GitHub

GitHub是基于git实现的代码托管。git是目前最好用的版本控制系统了&#xff0c;非常受欢迎&#xff0c;比之svn更好。 GitHub可以免费使用&#xff0c;并且快速稳定。 利用GitHub&#xff0c;你可以将项目存档&#xff0c;与其他人分享交流&#xff0c;并让其他开发者帮助你一…...

机器学习预处理-表格数据的空值处理

机器学习预处理-表格数据的空值处理 机器学习预处理-表格数据的分析与可视化中详细介绍了表格数据的python可视化&#xff0c;可视化能够帮助我们了解数据的构成和分布&#xff0c;是我们进行机器学习的必备步骤。上文中也提及&#xff0c;原始的数据存在部分的缺失&#xff0…...

python学opencv|读取图像(十二)BGR图像转HSV图像

【1】引言 前述已经学习了opencv中图像BGR相关知识&#xff0c;文章链接包括且不限于下述&#xff1a; python学opencv|读取图像&#xff08;六&#xff09;读取图像像素RGB值_opencv读取灰度图-CSDN博客 python学opencv|读取图像&#xff08;七&#xff09;抓取像素数据顺利…...

【C语言】库函数常见的陷阱与缺陷(六):输入输出函数

目录 一、printf 函数 1.1. 功能与用法 1.2. 陷阱与缺陷 1.3. 安全使用建议 1.4. 代码示例 二、scanf 函数 2.1. 功能与用法 2.2. 陷阱与缺陷 2.3. 安全使用建议 2.4. 代码示例 三、gets 函数 3.1. 功能与用法 3.2. 陷阱与缺陷 3.3. 安全使用建议 3.4. 代码示例…...

sunset: midnight

https://www.vulnhub.com/entry/sunset-midnight,517/ 主机发现端口扫描 探测存活主机&#xff0c;8是靶机 nmap -sP 192.168.56.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-05 16:49 CST Nmap scan report for 192.168.56.1 …...

CSS Backgrounds(背景)

CSS Backgrounds(背景) Introduction(介绍) CSS backgrounds play a crucial role in web design, allowing developers to apply colors, images, and other decorative elements to the background of HTML elements. This enhances the visual appeal of web pages and he…...

D101【python 接口自动化学习】- pytest进阶之fixture用法

day101 pytest的fixture执行顺序 学习日期&#xff1a;20241218 学习目标&#xff1a;pytest基础用法 -- pytest的fixture执行顺序 学习笔记&#xff1a; fixtrue的作用范围 实战结果 import pytestpytest.fixture(scopesession) def test_session():print(我是 session f…...

HCIA-Access V2.5_4_1_1路由协议基础_IP路由表

大型网络的拓扑结构一般会比较复杂&#xff0c;不同的部门&#xff0c;或者总部和分支可能处在不同的网络中&#xff0c;此时就需要使用路由器来连接不同的网络&#xff0c;实现网络之间的数据转发。 本章将介绍路由协议的基础知识、路由表的分类、静态路由基础与配置、VLAN间…...

Meta重磅发布Llama 3.3 70B:开源AI模型的新里程碑

在人工智能领域&#xff0c;Meta的最新动作再次引起了全球的关注。今天&#xff0c;我们见证了Meta发布的Llama 3.3 70B模型&#xff0c;这是一个开源的人工智能模型&#xff0c;它不仅令人印象深刻&#xff0c;而且在性能上达到了一个新的高度。 一&#xff0c;技术突破&#…...

20241218_segmentation

参考&#xff1a; 使用SA模型 https://ai.meta.com/research/publications/segment-anything/讲解生物学意义 https://www.nature.com/articles/s41593-024-01714-3#Sec13 x.0 workflow 图像分割方法识别出重要的ROI区域计算ROI区域个数&#xff08;需要计算机算法&#xff…...

公链常用的共识算法

1. 工作量证明&#xff08;Proof of Work, PoW&#xff09; 工作原理&#xff1a;要求节点&#xff08;矿工&#xff09;解决一个数学难题&#xff0c;这个过程称为挖矿。第一个解决难题的矿工将有权添加一个新的区块到区块链上&#xff0c;并获得一定数量的加密货币作为奖励。…...

监控易在汽车制造行业信息化运维中的应用案例

引言 随着汽车制造行业的数字化转型不断深入&#xff0c;信息化类IT软硬件设备的运行状态监控、故障告警、报表报告以及网络运行状态监控等成为了企业运维管理的关键环节。监控易作为一款全面、高效的信息化运维管理工具&#xff0c;在汽车制造行业中发挥着重要作用。本文将结合…...

Spring Boot项目使用虚拟线程

Spring Boot项目启用虚拟线程 开始基本使用先写一个测试方法通过springboot配置项开启虚拟线程 目前存在的问题 开始 虚拟线程正式发布是在JDK21&#xff0c;对于Spring Boot版本选择3以上。 基本使用 关于虚拟线程本身的使用&#xff0c;之前已经介绍过。这里要说的是直接将…...

Deveco Studio首次编译项目初始化失败

编译项目失败 Ohpm install失败的时候重新使用管理者打开程序 build init 初始化失败遇到了以下报错信息 Installing pnpm8.13.1... npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/pnpm failed, r…...

Unity 开发Apple Vision Pro空间锚点应用Spatial Anchor

空间锚点具有多方面的作用 虚拟物体定位与固定&#xff1a; 位置保持&#xff1a;可以把虚拟物体固定在现实世界中的特定区域或位置。即使使用者退出程序后再次打开&#xff0c;之前锚定过的虚拟物体仍然能够出现在之前所锚定的位置&#xff0c;为用户提供连贯的体验。比如在一…...

由学习率跟batch size 关系 引起的海塞矩阵和梯度计算在训练过程中的应用思考

最近看到了个一个学习率跟batch size 关系的帖子&#xff0c;里面说 OpenAI的《An Empirical *** Training》 通过损失函数的二阶近似分析SGD的最优学习率&#xff0c;得出“学习率随着Batch Size的增加而单调递增但有上界”的结论。推导过程中将学习率作为待优化参数纳入损失函…...

PHP开发日志 ━━ 基础知识:四种不同的变量返回方式该如何调用

最近在给框架升级&#xff0c;其中涉及到古早的缓存系统升级&#xff0c;现在准备区分类型为混合、变量和普通文件&#xff0c;那么变量用什么形式存储到缓存才能给后续开发带来便利和通用性呢&#xff1f;于是就涉及到了本文的php基础知识。 好吧&#xff0c;又是一个无用的知…...

centos上配置yum源

1. 进入yum源repo的目录 cd /etc/yum.repos.d/然后可以通过ls查看下面所有的后缀为.repo的文件 2. 新建一个备份目录&#xff0c;将原有的.repo文件放到其中 mkdir yum.repos.d.backup mv *.repo yum.repos.d.backup/3. 获取阿里提供的repo配置文件 这里使用到了wget命令&a…...