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

C++基础(2)

目录

1. 引用

1.1 引用的概念和定义

1.2 引用的特性

1.3 引用的使用

2. 常引用

3. 指针和引用的关系

4. 内联函数inline

5. nullptr


1. 引用

1.1 引用的概念和定义

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间, 它和它引用的变量共用同一块内存空间。

                                       类型&  引用别名 = 引用对象

不需要指针就可以交换两个变量的值 

#include<iostream>
using namespace std;
int main()
{int a = 2;//引用: b和c是a的别名int& b = a;int& c = a;//为别名b取别名,d相当于还是a的别名int& d = b;++d;//取地址cout << &a << "  " << a << endl;cout << &b << "  " << b << endl;cout << &c << "  " << c << endl;cout << &d << "  " << d << endl;return 0;
}

运行结果:

#include<iostream>
using namespace std;void Swap(int& rx, int& ry)//rx是x的别名,ry是y的别名
{int tmp = rx;rx = ry;ry = tmp;
}int main()
{int x = 4, y = 5;cout << x << "  " << y << endl;Swap(x, y);cout << x << "  " << y << endl;return 0;
}

运行结果:

1.2 引用的特性

  • 引用在定义时必须初始化
  • 一个变量可以有多个引用
  • 引用一旦引用一个实体,再不能引用其它实体
#include<iostream>
using namespace std;
int main()
{int a = 10;	//int& ra;   报错:"ra":必须初始化引用int& b = a;int& c = b;int d = 20;b = d;  //这里并非让b引用d ,C++引用不能改变指向//这里是赋值cout << a << "  " << &a << endl;cout << b << "  " << &b << endl;cout << c << "  " << &c << endl;cout << d << "  " << &d << endl;return 0;
}

运行结果:

1.3 引用的使用

  • 引用在实践中主要是用于引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被引用对象。
  • 引用传参跟指针传参功能是类似的,引用传参相对更方便一些。
  • 引用和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引用跟其他语言的引用(如Java)是有很大的区别的,除了用法,最大的点,C++引用定义后不能改变指向, Java的引用可以改变指向。

引用的类型不仅仅局限于普通变量,还可以是指针,比如我们之前学过的单链表头插或尾插,需要修改链表的头结点,如果链表为空链表,进行插入操作需要改变指针的指向,指针不再指向空,这时就需要传入二级指针用来改变一级指针的指向(具体可参考  单链表专题)。这里使用二级指针非常令人头疼。

typedef int SLTDataType;
typedef struct SListNode
{SLTDataType data;struct SListNode* next;
}SLTNode;//链表头插
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);newnode->next = *pphead; //将newnode和头结点连接在一起*pphead = newnode;       //将链表头结点指向新的头
}int main()
{SLTNode* slist = NULL; //空链表SLTPushFront(&slist, 1);return 0;
}

我们可以通过引用对其进行如下修改,形参Rslist是对slist 的引用,Rslist 就相当于 slist,等价于直接将链表传入,这里不需要使用二级指针了,相对而言简化了程序。

//链表头插
void SLTPushFront(SLTNode*& Rslist, SLTDataType x)//给指针变量slist取别名Rslist
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);newnode->next = Rslist; //将newnode和头结点连接在一起Rslist= newnode;       //将链表头结点指向新的头
}int main()
{SLTNode* slist = NULL; //空链表SLTPushFront(slist, 1);return 0;
}

一些主要用C语言实现版本数据结构教材中,使用引用替代指针传参,目的是简化程序,避开复杂的指针,如果没学过C++的引用,就不容易读懂代码了。

2. 常引用

  • 可以引用一个const对象,但是必须用const引用。const引用也可以引用普通对象,因为对象的访问权限在引用过程中可以缩小,但是不能放大
#include<iostream>
using namespace std;
int main()
{const int a = 10;//int& ra = a; //这⾥的引⽤是对a访问权限的放⼤   编译报错:“初始化” : 无法从“const int”转换为“int& ” //正确引用const int& ra = a;return 0;
}
#include<iostream>
using namespace std;
int main()
{// (1) const引用变量int b = 20;const int& m = b; //加入const 这里的引用是对b访问权限的缩小b++;  //b是可以修改的,但是m不能修改//m++;  报错:"m":不能给常量赋值return 0;
}

#include<iostream>
using namespace std;
int main()
{// (2) const引用常量const int& c = 25;//编译器会给常量25开辟一块内存,并将引用名作为这块内存的别名//常量不可修改,引用不能放大权限,所以需要const来修饰return 0;
}
  • 需要注意的是类似 int& rb = a*3; double d = 12.34; int& rd = d; 这样一些场景下,a*3的和结果保存在一个临时对象中,在类型转换中会产生临时对象存储中间值,也就是说,rb和rd引用的都是临时对象,而C++规定临时对象具有常性,所以这里就触发了权限放大,必须要用常引用才可以。
  • 所谓临时对象就是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象, C++中把这个未命名对象叫做临时对象。

采用如下方式e 是否正确引用 d?

double d = 6.34;
int& e = d;

上面引用的方式是不可行的,编译器报错,这里涉及隐式类型转换。

例如:double n = 4.09;   int m = n;  由于 n 的类型不是 int ,需要隐式转换成 int ,从 double 到 int 会丢失精度,会把 n 的整数部分取出来生成一个临时变量,然后再将这个变量的值赋值给 m 。临时变量具有常性,不能被修改,我们上面代码然放大了权限,需要const来修饰。

:如果变量类型相同,赋值是不会产生任何临时变量的,如果类型不同,不管是赋值还是引用,都会产生临时变量。

修正:

double d = 6.34;
const int& e = d;

此时的e是对临时变量的引用,它是临时变量的别名。

对权限控制的应用

下面定义的函数参数是普通的引用,在传参的时候会出现错误:

我们在函数的形参部分加入const:

3. 指针和引用的关系

C++中指针和引用就像两个性格迥异的亲兄弟,在实践中他们相辅相成,功能有重叠性,但是各有自己的特点,互相不可替代。

  • 语法概念上引用是一个变量的别名不开空间,指针是存储一个变量地址,要开空间。
  • 引用在定义时必须初始化,指针建议初始化,但是语法上不是必须的。 
  • 引用在初始化时引用一个对象后,就不能再引用其他对象;而指针可以不断地改变指向对象。 
  • 引用可以直接访问指向对象,指针需要解引用才能访问指向对象。 
  • sizeof中含义不同,引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下 占4个字节,64位下是8byte) 。
  • 指针很容易出现空指针和野指针的问题,引用很少出现,引用使用起来相对更安全一些。

指针和引用使用起来不一样,但在底层实现是其实是一样的,比如运行下面代码:

#include<iostream>
using namespace std;
int main()
{int a = 0;int* p = &a;*p = 2;int& ra = a;ra = 3;return 0;
}

转到反汇编观察一下:

我们发现指针和引用在底层汇编实现是一致的,引用实际上也是通过指针来实现的。

4. 内联函数inline

用 inline 修饰的函数叫做内联函数,类似于C语言中的宏展开,编译时C++编译器会在调用的地方展开内联函数,这样调用内联函数就不需要建立栈帧了,就可以提高效率。

特性:

  • C语言实现宏函数也会在预处理时替换展开,但是宏没有类型检查,无论对还是错都是直接替换,而内联函数在编译时进行安全检查,C++设计了 inline 目的就是替代宏函数。
  • inline对于编译器而言只是一个建议,也就是说,你加了inline 编译器也可以选择在调用的地方不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline 适用于频繁调用的短小函数,对于代码很长或者有循环/递归的函数不适宜使用作为内联函数,加上inline也会被编译器忽略。
  • inline不建议声明和定义分离到两个文件,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接时会出现报错,都直接定义在头文件里就行。

//实现⼀个ADD宏函数的常⻅问题(错误写法)//#define ADD(int a, int b) return a + b;//#define ADD(a, b) a + b;//#define ADD(a, b) (a + b)// 正确的宏实现
#define ADD(a, b) ((a) + (b))int main()
{int ret = ADD(1, 2);//为什么不能加分号?cout << ADD(1, 2) << endl;//为什么要加外⾯的括号?cout << ADD(1, 2) * 5 << endl;//为什么要加⾥⾯的括号?int x = 1, y = 2;ADD(x & y, x | y);   // -> (x&y+x|y)return 0;
}

我们观察以下代码内联函数有没有被展开:

#include<iostream>
using namespace std;inline int Add(int x, int y)
{int ret = x + y;	return ret;
}int main()
{int ret = Add(1, 2);	cout << ret << endl;	return 0;
}

调试转到反汇编,我们发现: 

上面编译器生成的汇编代码中存在call Add ,并且创建了函数栈帧,这说明内联函数没有被展开,这是由于vs编译器debug版本下面默认是不展开inline的,这样方便调试,debug版本想展开需要设置以下两个地方:

Debug版本下,完成了对编译器的设置后,再来转到反汇编观察: 

下面汇编代码中不存在call指令,Add函数直接被展开了 

内联函数展不展开,还得看编译器认不认,比如下面程序:

#include<iostream>
using namespace std;inline int Add(int x, int y)
{int ret = x + y;ret += 1;ret += 1;ret += 1;ret += 1;ret += 1;ret += 1;ret += 1;ret += 1;ret += 1;return ret;
}int main()
{int ret = Add(1, 2);	cout << ret << endl;	return 0;
}

转入反汇编观察: 

函数变复杂了,Add函数并没有被展开,很好的展现了内联函数的特性。

 

5. nullptr

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

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

条件编译的宏定义,能确保在不同编程环境下正确处理NULL的定义。 

在C++中,NULL 可能被定义为整数 0,这可能导致在某些情况下的类型不安全,例如:

#include<iostream>
using namespace std;void f(int x)
{cout << "f(int x)" << endl;
}void f(int* ptr)
{cout << "f(int* ptr)" << endl;
}int main()
{f(NULL); //调用f(int x) 与预期不符f((int*)NULL);//f((void*)NULL);  报错: "f": 没有重载函数可以转换所有参数类型f(nullptr);//被隐式转换为int*指针类型return 0;
}

运行结果:

上面程序中 f(NULL)语句,本想调用指针版本的 f(int*)函数,但是由于NULL被定义成 0,调用了f(int x)因此与程序的初衷相悖。

  • C++11中引入nullptr,从C++11开始使用 nullptr 取代NULL,nullptr是一个特殊的关键字,nullptr是一种特殊类型的字面量,它可以转换成任意其他类型的指针类型。使用nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,而不能被转换为整数类型。

nullptr可以明确的表达空指针的含义,NULL可能引起歧义,因此,在 C++ 中,通常推荐使用 nullptr 而不是 NULL。

相关文章:

C++基础(2)

目录 1. 引用 1.1 引用的概念和定义 1.2 引用的特性 1.3 引用的使用 2. 常引用 3. 指针和引用的关系 4. 内联函数inline 5. nullptr 1. 引用 1.1 引用的概念和定义 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开…...

C#中的if判断语句详解

SEO Meta Description: 了解C#中的if判断语句&#xff0c;包括基本用法、嵌套使用、多条件判断以及最佳实践&#xff0c;全面掌握条件控制在C#编程中的应用。 介绍 在编程中&#xff0c;条件判断语句是控制程序流程的关键部分。C#提供了多种条件判断语句&#xff0c;其中 if语…...

PythonStyle MVC 开发框架

在 Python 中&#xff0c;MVC&#xff08;Model - View - Controller&#xff0c;模型 - 视图 - 控制器&#xff09;是一种常见的软件设计模式&#xff0c;它将应用程序分为三个主要部分&#xff0c;各自承担不同的职责&#xff0c;以提高代码的可维护性、可扩展性和可测试性。…...

excel实用问题:提取文字当中的数字进行运算

0、前言&#xff1a; 这里汇总在使用excel工作过程中遇到的问题&#xff0c;excel使用wps版本&#xff0c;小规模数据我们自己提取数据可行&#xff0c;大规模数据就有些难受了&#xff0c;因此就产生了如下处理办法。 需求&#xff1a;需要把所有文字当中的数字提取出来&…...

FFmpeg:多媒体处理的瑞士军刀

FFmpeg&#xff1a;多媒体处理的瑞士军刀 前言 FFmpeg 是一个功能强大且跨平台的开源多媒体框架&#xff0c;广泛应用于音视频处理领域。 它由多个库和工具组成&#xff0c;能够处理各种音视频格式&#xff0c;涵盖编码、解码、转码、流处理等多种操作。 无论是专业视频编辑…...

在K8S中,如何把某个worker节点设置为不可调度?

在Kubernetes中&#xff0c;如果你想要把一个worker节点设置为不可调度&#xff0c;意味着你不想让Kubernetes调度器在这个节点上调度新的Pod。这通常用于维护或升级节点&#xff0c;或者当节点遇到硬件故障或性能问题时&#xff0c;要将某个worker节点设置为不可调度。 方法1…...

雷赛LC2000

【一&#xff0c;概述】 这个是中型PLC 【二&#xff0c;外观】 网口编号&#xff1a; 【2】【3】 //默认ip&#xff1a;192.168.1.xxx 【0】【1】 可视化授权不如禾川Q系。 【三&#xff0c;总线轴】 因为本次带的轴是台达A2系列伺服 A2最快总线是【1ms】的倍数…...

Android学习20 -- 手搓App2(Gradle)

1 前言 昨天写了一个完全手搓的&#xff1a;Android学习19 -- 手搓App-CSDN博客 后面谷歌说不要用aapt&#xff0c;d8这些来搞。其实不想弄Gradle的&#xff0c;不过想着既然开始了&#xff0c;就多看一些。之前写过一篇Gradle&#xff0c;不过是最简单的编译&#xff0c;不涉…...

Mac M1 Comfyui 使用MMAudio遇到的问题解决?

问题1: AssertionError: Torch not compiled with CUDA enabled&#xff1f; 解决办法&#xff1a;修改代码以 CPU 运行 第一步&#xff1a;找到 /ComfyUI/custom_nodes/ComfyUI-MMAudio/mmaudio/ext/autoencoder/vae.py文件中的下面这两行代码 self.data_mean nn.Buffer(t…...

Vim的基础命令

移动光标 H(左) J(上) K(下) L(右) $ 表示移动到光标所在行的行尾&#xff0c; ^ 表示移动到光标所在行的行首的第一个非空白字符。 0 表示移动到光标所在行的行首。 W 光标向前跳转一个单词 w光标向前跳转一个单词 B光标向后跳转一个单词 b光标向后跳转一个单词 G 移动光标到…...

【后端面试总结】ES的_template与_index_template技术详解

在Elasticsearch&#xff08;简称ES&#xff09;中&#xff0c;索引模板&#xff08;Index Template&#xff09;和组件模板&#xff08;Component Template&#xff09;是两种用于预定义索引配置的强大工具。它们允许用户在索引创建时自动应用预设的设置、映射&#xff08;Map…...

使用LightGlue进行图像配准并提取图像重叠区域

发表日期&#xff1a;2023年6月23日 项目地址&#xff1a;https://github.com/cvg/LightGlue https://github.com/cvg/glue-factory/ LightGlue是一个在精度上媲美Superglue&#xff0c;但在速度上比Superglue快一倍的模型。通过博主实测&#xff0c;LightGlue的配准效果比Su…...

RK3568使用QT搭建TCP服务器和客户端

文章目录 一、让RK3568开发板先连接上wifi二、客户端代码1. `widget.h` 文件2. `widget.cpp` 文件**详细讲解**1. **`Widget` 类构造函数 (`Widget::Widget`)**2. **UI 布局 (`setupUI`)**3. **连接按钮的槽函数 (`onConnectClicked`)**4. **发送消息按钮的槽函数 (`onSendMess…...

解释 Java 中的垃圾回收机制,以及如何优化垃圾回收性能?

Java中的垃圾回收机制是一种自动管理内存的机制&#xff0c;它负责在程序运行过程中检测和清除不再被引用的对象&#xff0c;从而释放其占用的内存空间。 垃圾回收机制通过标记-清除、复制、标记-整理等算法实现&#xff0c;能够有效避免内存泄漏&#xff0c;提高程序的性能和…...

读写锁: ReentrantReadWriteLock

在多线程编程场景中&#xff0c;对共享资源的访问控制极为关键。传统的锁机制在同一时刻只允许一个线程访问共享资源&#xff0c;这在读写操作频繁的场景下&#xff0c;会因为读操作相互不影响数据一致性&#xff0c;而造成不必要的性能损耗。ReentrantReadWriteLock&#xff0…...

2022ACMToG | 寻找快速的去马赛克算法

文章标题&#xff1a;Searching for Fast Demosaicking Algorithms 1. Abstract 本文提出了一种方法&#xff0c;用于在给定损失函数和训练数据的情况下&#xff0c;自动合成高效且高质量的去马赛克算法&#xff0c;涵盖各种计算开销。该方法执行多目标的离散-连续优化&#x…...

暴力破解与验证码安全

目录 前言 暴力破解&#xff1a;简单粗暴的黑客攻击手段 暴力破解的前提条件 暴力破解的定义与原理 常见的暴力破解工具 暴力破解的常见场景 暴力破解的危害 验证码&#xff1a;抵御暴力破解的第一道防线 验证码的定义与作用 验证码的工作原理 验证码的类型 验证码…...

基于区块链的数字身份认证:安全与隐私的未来

友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…...

ComfyUI工作流 图像反推生成人像手办人像参考(SDXL版)

文章目录 图像反推生成人像手办人像参考SD模型Node节点工作流程效果展示开发与应用图像反推生成人像手办人像参考 本工作流旨在通过利用 Stable Diffusion XL(SDXL)模型和相关辅助节点,实现高效的人像参考生成和手办设计。用户可通过加载定制的模型、LORA 调整和控制节点对…...

MyBatis-Plus速成指南:基本CURD

BaseMapper&#xff1a; MyBatis-Plus 中的基本 CURD 在内置的 BaseMapper 中都已得到了实现&#xff0c;我们可以直接使用接口&#xff0c;接口如下&#xff1a; // // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) //p…...

K8S集群部署--亲测好用

最近在自学K8S&#xff0c;花了三天最后终于成功部署一套K8S Cluster集群&#xff08;masternode1node2&#xff09; 在这里先分享一下具体的步骤&#xff0c;后续再更新其他的内容&#xff1a;例如部署期间遇到的问题及其解决办法。 部署步骤是英文写的&#xff0c;最近想练…...

【C++】B2124 判断字符串是否为回文

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式&#xff1a;输出格式&#xff1a;样例&#xff1a; &#x1f4af;方法一&#xff1a;我的第一种做法思路代码实现解析 &#x1f4af;方法二&#xff1a;我…...

大语言模型概述

一、主流大语言模型&#xff08;LLMs&#xff09; GPT系列&#xff08;OpenAI&#xff09; 基于Transformer解码器架构&#xff0c;以生成能力著称&#xff0c;代表产品包括ChatGPT&#xff08;GPT-3.5/4&#xff09;&#xff0c;支持多轮对话、文本生成和复杂推理。其优势在于…...

【网络】应用层协议http

文章目录 1. 关于http协议2. 认识URL3. http协议请求与响应格式3.1 请求3.2 响应 3. http的常见方法4. 状态码4.1 常见状态码4.2 重定向 5. Cookie与Session5.1 Cookie5.1.1 认识Cookie5.1.2 设置Cookie5.1.3 Cookie的生命周期 5.2 Session 6. HTTP版本&#xff08;了解&#x…...

Node.js常用知识

Nodejs 总结Node.js基础知识&#xff0c;便于定期回顾 1、fs 文件写入 1、require(‘fs’) 2、fs.writeFile() 3、fs.appendFile() 4、fs.createwriteStream&#xff08;&#xff09; //流式写入 ws.write() 文件读取 1、fs.readFile(‘’,(err,data)>{ }) const …...

Block Blaster Online:免费解谜游戏的乐趣

Block Blaster Online 是一款免费的在线解谜游戏&#xff0c;它将挑战你的思维和反应能力&#xff01;在这里&#xff0c;你可以匹配五彩缤纷的方块&#xff0c;创造出令人惊叹的组合&#xff0c;享受无尽的解谜乐趣。无需安装&#xff0c;点击即可开始&#xff0c;加入全球数百…...

4 前置技术(下):git使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 前言...

Qwen2.5-Max:AI技术的新里程碑

随着人工智能&#xff08;AI&#xff09;技术的不断进步&#xff0c;全球各大科技公司都在竞相推出更强大的语言模型。近日&#xff0c;阿里巴巴发布了其最新的超大规模混合专家模型&#xff08;MoE&#xff09;——Qwen2.5-Max&#xff0c;这一成果不仅在多个基准测试中超越了…...

PyQt4学习笔记1】使用QWidget创建窗口

目录 一、创建一个简单的 QWidget 窗口 二、设置窗口属性 1. 设置窗口标题 2. 设置背景颜色 3. 设置窗口大小和位置 4. 设置窗口模式 5. 关闭窗口 6. QWidget 及其子控件的样式 三、添加控件到 QWidget 1. 添加按钮 2. 添加标签 3. 添加文本框 4. 控件布局管理 四、自定义样式 …...

九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)

九. Redis 持久化-RDB(详细讲解说明&#xff0c;一个配置一个说明分析&#xff0c;步步讲解到位) 文章目录 九. Redis 持久化-RDB(详细讲解说明&#xff0c;一个配置一个说明分析&#xff0c;步步讲解到位)1. RDB 概述2. RDB 持久化执行流程3. RDB 的详细配置4. RDB 备份&恢…...

Redis --- 秒杀优化方案(阻塞队列+基于Stream流的消息队列)

下面是我们的秒杀流程&#xff1a; 对于正常的秒杀处理&#xff0c;我们需要多次查询数据库&#xff0c;会给数据库造成相当大的压力&#xff0c;这个时候我们需要加入缓存&#xff0c;进而缓解数据库压力。 在上面的图示中&#xff0c;我们可以将一条流水线的任务拆成两条流水…...

使用VCS对Verilog/System Verilog进行单步调试的步骤

Verilog单步调试&#xff1a; System Verilog进行单步调试的步骤如下&#xff1a; 1. 编译设计 使用-debug_all或-debug_pp选项编译设计&#xff0c;生成调试信息。 我的4个文件&#xff1a; 1.led.v module led(input clk,input rst_n,output reg led );reg [7:0] cnt;alwa…...

Go语言中结构体字面量

结构体字面量&#xff08;Struct Literal&#xff09;是在 Go 语言中用于创建和初始化结构体实例的一种语法。它允许你在声明结构体变量的同时&#xff0c;直接为其字段赋值。结构体字面量提供了一种简洁、直观的方式来创建结构体对象。 结构体字面量有两种主要形式&#xff1…...

编程AI深度实战:大模型哪个好? Mistral vs Qwen vs Deepseek vs Llama

​​ 系列文章&#xff1a; 编程AI深度实战&#xff1a;私有模型deep seek r1&#xff0c;必会ollama-CSDN博客 编程AI深度实战&#xff1a;自己的AI&#xff0c;必会LangChain-CSDN博客 编程AI深度实战&#xff1a;给vim装上AI-CSDN博客 编程AI深度实战&#xff1a;火的编…...

19C RAC在vmware虚拟机环境下的安装

RAC安装规划 ===IP== ORA19C01 public ip : 192.168.229.191 heatbeat : 192.168.0.1 vip : 192.168.229.193 ORA19C02 public ip :192.168.229.192 heatbeat : 192.168.0.2 vip : 192.168.229.194 scan ip 192.168.229.195 hosts: echo "192.168.229…...

MongoDB 查询文档

MongoDB 查询文档 引言 MongoDB 是一个功能强大的文档型数据库,它使用 JSON 格式存储数据,并提供了灵活的查询机制。本文将深入探讨 MongoDB 的查询文档,包括查询基础、查询语法、查询优化以及一些高级查询技巧。 查询基础 MongoDB 的查询语句以 find() 方法开始,它允许…...

了解 ALV 中的 field catalog (ABAP List Viewer)

在 ABAP 中&#xff0c;字段目录是使用 ALV &#xff08;ABAP List Viewer&#xff09; 定义内部表中的数据显示方式的关键元素。它提供对 ALV 中显示的字段的各种属性的控制&#xff0c;例如列标题、对齐方式、可见性、可编辑性等。关键概念&#xff1a; Field Catelog 字段目…...

【C++STL标准模板库】二、STL三大组件

文章目录 1、容器2、算法3、迭代器 二、STL三大组件 1、容器 容器&#xff0c;置物之所也。 研究数据的特定排列方式&#xff0c;以利于搜索或排序或其他特殊目的&#xff0c;这一门学科我们称为数据结构。大学信息类相关专业里面&#xff0c;与编程最有直接关系的学科&…...

【高级篇 / IPv6】(7.2) ❀ 04. 在60E上配置ADSL拨号宽带上网(IPv4) ❀ FortiGate 防火墙

【简介】除了单位用户以外&#xff0c;大部分个人用户目前使用的仍然是30E、50E、60E系列防火墙&#xff0c;固件无法达到目前最高版本7.6&#xff0c;这里以最常用的60E为例&#xff0c;演示固件版本7.2下实现ADSL拨号宽带的IPv6上网。由于内容比较多&#xff0c;文章分上、下…...

基础IOIO

1.理解文件 1.侠义理解 文件是在从盘上的。磁盘是永久性存储介质。磁盘是外设。磁盘上对文件的所有操作&#xff0c;都是对外设的输入输出IO。 2.广义理解 linux下一切皆文件&#xff08;键盘&#xff0c;显示器&#xff0c;网卡&#xff0c;磁盘&#xff09; 3.文件操作的…...

starrocks最佳实践、行业实践

最佳实践 starrocks最佳实践 最佳实践集合 Bitmap索引适用场景和最佳实践 行业实践 行业实践...

详解CSS `clear` 属性及其各个选项

详解CSS clear 属性及其各个选项 1. clear: left;示例代码 2. clear: right;示例代码 3. clear: both;示例代码 4. clear: none;示例代码 总结 在CSS布局中&#xff0c;clear 属性是一个非常重要的工具&#xff0c;特别是在处理浮动元素时。本文将详细解释 clear 属性及其各个选…...

MVC、MVP和MVVM模式

MVC模式中&#xff0c;视图和模型之间直接交互&#xff0c;而MVP模式下&#xff0c;视图与模型通过Presenter进行通信&#xff0c;MVVM则采用双向绑定&#xff0c;减少手动同步视图和模型的工作。每种模式都有其优缺点&#xff0c;适合不同规模和类型的项目。 ### MVVM 与 MVP…...

【大数据技术】教程03:本机PyCharm远程连接虚拟机Python

本机PyCharm远程连接虚拟机Python 注意:本文需要使用PyCharm专业版。 pycharm-professional-2024.1.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本地PyCharm远程连接虚拟机,运行Python脚本,提高编程效率。 注意: …...

wsl+phpstorm+xdebug|windows子系统配置phpstorm开发调试|断点调试

安装wsl 安装apache php 安装xdebug扩展&#xff0c;并配置 这里是通过宝塔9.4面板安装的xdebug3.0 [xdebug] xdebug.modedebug xdebug.start_with_requesttrue xdebug.discover_client_hosttrue xdebug.client_host127.0.0.1配置PHPSTORM 注意&#xff1a;新建服务器一定要…...

如可安装部署haproxy+keeyalived高可用集群

第一步&#xff0c;环境准备 服务 IP 描述 Keepalived vip Haproxy 负载均衡 主服务器 Rip&#xff1a;192..168.244.101 Vip&#xff1a;192.168.244.100 Keepalive主节点 Keepalive作为高可用 Haproxy作为4 或7层负载均衡 Keepalived vip Haproxy 负载均衡 备用服务…...

Linux——文件与磁盘

1. 磁盘结构 磁盘在我们的计算机中有着重要的地位&#xff0c;当文件没有被打开时其数据就存储在磁盘上&#xff0c;要了解磁盘的工作原理先要了解磁盘的结构。 1.1 磁盘的物理结构 以传统的存储设备机械硬盘为例&#xff0c;它通过磁性盘片和磁头来读写数据。磁盘内部有多个旋…...

Maven jar 包下载失败问题处理

Maven jar 包下载失败问题处理 1.配置好国内的Maven源2.重新下载3. 其他问题 1.配置好国内的Maven源 打开⾃⼰的 Idea 检测 Maven 的配置是否正确&#xff0c;正确的配置如下图所示&#xff1a; 检查项⼀共有两个&#xff1a; 确认右边的两个勾已经选中&#xff0c;如果没有请…...

Qt中的UIC、MOC、RCC宏定义说明

在Qt6新建工程的时候&#xff0c;CMakeLists.txt中会默认带有UIC&#xff0c;MOC&#xff0c;RCC的3个宏定义。 set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) uic(User Interface Compiler)&#xff0c;用户界面编译器&#xff0c;将根据.ui文件生成相…...

SQLite Update 语句详解

SQLite Update 语句详解 SQLite 是一款轻量级的数据库管理系统&#xff0c;以其简单、易用和高效的特点在全球范围内得到了广泛的应用。在 SQLite 中&#xff0c;UPDATE 语句是用于修改数据库表中记录的常用命令。本文将详细解析 SQLite 的 UPDATE 语句&#xff0c;包括其语法…...