【C++初阶】C++简单入门(长期维护)

本篇博客是对C++的一些简单知识分享,有需要借鉴即可。

C++简单入门目录

  • 一、C++前言
    • 1.C++的概念:
    • 2.C++发展历程
    • 3.C++如何学?
  • 二、C++入门
    • 1.C++关键字(C++98标准)
    • 2.命名空间
    • 3.C++输入&输出
      • ①概念说明
      • ②使用说明
      • ③特征说明
      • ④细节拓展
      • ⑤cout与cin的意义
    • 4.缺省参数
      • ①概念说明
      • ②使用规则
      • ③应用举例
      • ④缺省参数的意义
    • 5.函数重载
      • ①概念
    • 6.引用
      • ①概念
      • ②特性
      • ③应用场景
        • 1.做参数
          • - 1.引用做输出型参数,更加方便
          • - 2.引用在对象比较大情况下,用引用代替值拷贝更加高效
        • 2.做返回值
          • - 1错误的引用做返回值用法
          • - 2.正确的引用返回---修改返回对象
          • - 3.正确的引用返回---减少拷贝提高效率
      • ④引用和指针的区别
      • ⑤引用的意义
    • 7.内联函数
      • 内联函数概念
      • 内联函数特性
      • 内联函数意义
      • 内联函数的认识
    • 8.auto关键字
      • auto概念
      • auto特性
      • auto意义
      • suto的认识
    • 9.for的范围用法
    • 10.NULL与nullptr
      • C++中NULL的问题

一、C++前言

1.C++的概念:

一种高级编程语言,由C发展而来,满足过程化程序设计、基于对象的程序设计、面向对象的程序设计。

2.C++发展历程

在这里插入图片描述
C++最新发展:LINK

3.C++如何学?

  • 写博客总结
  • 定期画思维导图总结
  • 常复习(博客笔记、知乎答案、看书)
  • 刷题

二、C++入门

1.C++关键字(C++98标准)

在这里插入图片描述

2.命名空间

C++命名空间概念:一种命名域、是C++专门用来解决C语言变量命名冲突问题而产生的。
命名空间的意义很大程度上解决C变量命名冲突问题。

知识拓展:C中的命名冲突
命名冲突主要有两大类:

  • 程序员 与 库
    在这里插入图片描述

  • 程序员 与 程序员

知识拓展1:域,C++上指的是作用域LINK
在C++中,大体有四种域:

  • 全局域:生命周期 访问
  • 局部域:生命周期 访问
  • 命名空间域:访问
  • 类域


知识拓展2:编译器对名称的搜索原则:

  • 在不指定域的情况下
  1. 当前域
  2. 全局域
  • 在指定域的情况下
  1. 直接去指定域搜索

命名空间的定义: namespace关键字+命名空间的名字+{…}

  1. 命名空间中可以定义变量/函数/类型
  2. 命名空间可以嵌套
  3. 同一命名空间会被合并
namespace bit
{// 命名空间中可以定义变量/函数/类型int rand = 10;int Add(int left, int right){return left + right;}
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

命名空间的使用:

  • 法1:指定访问

需要用到访问操作符 ::

  1. 访问变量/函数 命名空间名称 + :: + 变量名/函数名
  2. 访问结构体 struct + 空间名 + :: + 结构体名
  • 法2:直接访问(展开访问)

需要用到指令:using namespace + 空间名 —>等价于把空间内的命名放到全局变量

  • 法3:展开特定项

eg:using std::cout;

在这里插入图片描述

总结:对比指定访问与展开访问,分析其利弊
答:

  • 指定访问 解决变量冲突问题 麻烦
  • 展开访问 直接把变量放到全局中 方便
  • 部分展开 把常用的变量放到全局中 方便
    其中,做项目一般使用第1与第3方式,第2种方法一般在练习中使用。

头文件展开与命名空间展开的区别:
头文件的展开本质是在预处理阶段拷贝头文件内容。
命名空间的展开本质是影响编译器的搜索规则。

3.C++输入&输出

①概念说明

cpp的输入输出分别是cout与cin,这两个函数均包含在iostream头文件中,在使用时需要展开命名空间进行使用。
在这里插入图片描述

②使用说明

#include<iostream>
using namespace std;int main()
{// <<,1.左移int a = 10;a = a << 1;printf("a<<1:%d\n", a);// <<,2.流插入cout << "hello cpp" << endl;// >>,1.右移a = a >> 1;printf("a>>1:%d\n", a);// >>.2.流提取cin >> a;return 0;
}

③特征说明

下面是cout的特征说明示例:cin也是同理

④细节拓展

在这里插入图片描述

⑤cout与cin的意义

弥补了C语言自定义类型输入输出麻烦的问题

4.缺省参数

①概念说明

缺省参数是c++提供的一种在函数缺少传入值的情况下使用默认值的一种参数。

缺省参数分为两类

  • 全缺省参数
    在这里插入图片描述

  • 半缺省参数
    在这里插入图片描述

②使用规则

  • 有实参优先使用,没有实参使用默认参数
    在这里插入图片描述
  • 缺省参数函数传实参时候从左到右依次给值,缺省参数函数形参从右向左依次给默认值
  • 缺省参数不能在声明与定义中同时出现,要优先给函数声明使用缺省
    在这里插入图片描述
  • 缺省值必须是常量值或者全局变量

思考:为什么缺省参数要优先在函数声明中使用?而不是优先给函数定义使用?
答:
我们首先要明白编译器的编译原理,编译器首先要进行预处理,在这一步中展开头文件,之后编译器要进行编译,在这一步中编译器主要是检查语法,通常情况下,这种时候每个源文件都是独立的,每个调用函数的源文件中也自然大概率没有函数的定义,但是已经有了函数声明(因为经过了预处理),所以为了要让编译器不报错,肯定是先让函数声明有缺省参数。


那为什么不直接函数定义也有缺省参数,函数声明也有缺省参数呢?
因为语法是规定只能有一个的。
在这里插入图片描述

③应用举例

在c语言阶段,我们设计一个栈时候往往初始化不知道要给几个空间,这样我们可以给一个缺省参数来默认给值,然后不够了的话扩容。
在这里插入图片描述

④缺省参数的意义

对函数定义更加灵活化。

5.函数重载

①概念

函数名相同,函数参数不同,称为函数重载

函数参数不同在哪里?

  • 参数的类型不同
    在这里插入图片描述
  • 参数的个数不同
    在这里插入图片描述
  • 参数的顺序不同

思考:编译器是如何支持函数重载的?C语言就不行。
答:名称修饰
在这里插入图片描述

6.引用

①概念

引用:底层汇编层面是用指针实现的,但是在语法层面上是为变量起别名,与指针起到互补作用。
在这里插入图片描述

②特性

  1. 引用在定义时必须初始化
    在这里插入图片描述

  2. 引用不能更改指向
    在这里插入图片描述
    在这里插入图片描述

  3. 一个变量可以有多个引用
    在这里插入图片描述

思考:引用可以完全替代指针吗?
答:不能,引用往往是在用指针比较复杂的地方代替指针。
为什么引用不能完全替代指针?
虽然引用可以在大多数情况下替代指针的使用从而简化指针,但是某些情况下是不能用引用解决的。
比如下面这个例子:
现在有一个单链表,要求删除中间的一个结点。
在这里插入图片描述
这里的关键点就在于引用不能改变指向,现在你把中间结点删除了,但是前面结点的指向怎么办?

//例子,链表
typedef int SLTDataType;
typedef struct SListNode
{SLTDataType val;struct SListNode* next;
}SLNode, * PSLNode;//指针的方法
void SLPush(SLNode** pphead, SLTDataType x)
{assert(pphead);SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->next = NULL;newnode->val = x;if (*pphead == NULL){*pphead = newnode;return;}else{SLNode* pcur = *pphead;while (pcur->next){pcur = pcur->next;}pcur->next = newnode;}
}//引用的方法
void SLPush(SLNode*& pphead , SLTDataType x)
{assert(pphead);SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->next = NULL;newnode->val = x;if (pphead == NULL){pphead = newnode;return;}else{SLNode* pcur = pphead;while (pcur->next){pcur = pcur->next;}pcur->next = newnode;}
}void SLPrint(SLNode*& phead)
{while (phead){cout << phead->val << "  ";phead = phead->next;}
}void test_3()
{SLNode* phead = NULL;SLPush(&phead, 1);SLPush(phead, 2);SLPush(&phead, 3);SLPush(phead, 4);SLPrint(phead);
}

③应用场景

1.做参数
void C_Swap(int* a,int* b)
{int temp = *a;*a = *b;*b = temp;
}void CPP_Swap(int& a2, int& b2)//在这里可以起与实参一样的名字吗?可以。因为属于不同的域。
{int temp = a;a = b;b = temp;
}void test_1()
{int a1 = 10;int b1 = 20;printf("a1 = %d , b1 = %d\n", a1, b1);C_Swap(&a1,&b1);printf("a1 = %d , b1 = %d\n", a1, b1);int a2 = 10;int b2 = 20;cout << "a2 = " << a2 << " b2 = " << b2 << endl;CPP_Swap(a2, b2);cout << "a2 = " << a2 << " b2 = " << b2 << endl;
}

思考:在这里可以起与实参一样的名字吗?
答:可以,因为属于不同的域。

在做函数参数这一用法上,用引用可以有两大好处

- 1.引用做输出型参数,更加方便

在这里插入图片描述
输出型参数:能够通过改变形参影响实参。

- 2.引用在对象比较大情况下,用引用代替值拷贝更加高效
void testfunc1(A a)
{;
}void testfunc2(A& a)
{;
}void test_4()
{	A a;//以值作为函数参数size_t begin1 = clock();for (int i = 0; i < 10000; i++){testfunc1(a);}size_t end1 = clock();//以引用作为函数参数size_t begin2 = clock();for (int i = 0; i < 10000; i++){testfunc2(a);}size_t end2 = clock();printf("%zd ", end1 - begin1);printf("%zd ", end2 - begin2);
}

在这里插入图片描述

传值、传引用效率比较
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

2.做返回值
- 1错误的引用做返回值用法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


如何规避函数的野引用?
答:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。
那该如何正确使用引用来返回函数值呢?
一般是返回静态变量,全局变量,堆上的空间…等等。

- 2.正确的引用返回—修改返回对象

对比C中的get函数与c++中的get函数
读下面代码。
get如果返回int,那么就是一种值拷贝,如果是int&,那么就是别名。不但可以读还可以写。


struct SLTNode {int* a;int size;int capacity;
};void SLTInit(struct SLTNode& sl)
{sl.a = NULL;sl.capacity = sl.size = 0;
}void SLTPush(struct SLTNode& sl,int x)
{//...扩容if (sl.size == sl.capacity){int* psl = (int*)realloc(sl.a, 10*sizeof(int));sl.a = psl;sl.capacity+=10;}//检查sl.a[sl.size++] = x;
}void SLTPrint(struct SLTNode& sl)
{int i = 0;for (int i = 0; i < sl.size; i++){cout << sl.a[i];}
}void SLTModify(struct SLTNode& sl,int pos,int x)
{sl.a[pos] = x;
}void test_C()
{//例子:顺序表struct SLTNode sl;SLTInit(sl);SLTPush(sl, 1);SLTPush(sl, 2);SLTPush(sl, 3);SLTPush(sl, 4);SLTPrint(sl);
}void test_CPP()
{struct SeqList{// 成员变量int* a;int size;int capacity;// 成员函数void Init(){a = (int*)malloc(sizeof(int) * 4);// ...size = 0;capacity = 4;}void PushBack(int x){// ... 扩容a[size++] = x;}// 读写返回变量int& Get(int pos)//这个地方如果返回int,那么就是一种值拷贝,如果是int&,那么就是别名。不但可以读还可以写。{assert(pos >= 0);assert(pos < size);return a[pos];}int& operator[](int pos){assert(pos >= 0);assert(pos < size);return a[pos];}};struct SeqList a;a.Init();a.PushBack(1);a.PushBack(2);a.PushBack(3);a.PushBack(4);for (int i = 0; i < 4; i++){cout << a.Get(i) << "  ";}}void test_5()
{//test_C();test_CPP();
}
- 3.正确的引用返回—减少拷贝提高效率

与引用做参数是一样的,这里不做细细说明。

#include <time.h>
struct A{ int a[10000]; };
A a;
// 值返回
A TestFunc1() { return a;}
// 引用返回
A& TestFunc2(){ return a;}
void TestReturnByRefOrValue()
{// 以值作为函数的返回值类型size_t begin1 = clock();for (size_t i = 0; i < 100000; ++i)TestFunc1();size_t end1 = clock();// 以引用作为函数的返回值类型size_t begin2 = clock();for (size_t i = 0; i < 100000; ++i)TestFunc2();size_t end2 = clock();// 计算两个函数运算完成之后的时间cout << "TestFunc1 time:" << end1 - begin1 << endl;cout << "TestFunc2 time:" << end2 - begin2 << endl;
}

④引用和指针的区别

  • 从语法层面来看
    • 引用是别名,不需要额外开空间,指针需要额外开空间使用
    • 引用必须初始化,指针可以选择不初始化
    • 引用不能改变防线,指针可以任意改变方向
    • 引用相对安全,不容易写出问题;指针容易写出野指针
    • sizeof,++,解引用等方面的区别
  • 从底层层面来看
    • 从汇编层面上,没有引用,引用都会被转换为指针。
      在这里插入图片描述

⑤引用的意义

引用不是用来替代指针的,而是弥补指针在有些地方的不适用,比如二级指针、三级指针过于复杂,比如指针作参数,作返回值修改不够方便等等问题。

7.内联函数

内联函数概念

概念:
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

下面为内联函数和一般函数的比较:一般函数建立了栈帧,内联函数没有建立栈帧。

int add1(int a,int b)
{return a + b;
}inline int add2(int a,int b)
{return a + b;
}void test_5()
{//假设add函数需要大量重复调用int a = 10;int b = 20;//一般函数add1int c = add1(a, b);//内联函数add2对照c = add2(a, b);
}

在这里插入图片描述

注:如果想要看到上面对比图需要对编译器优化进行配置
在这里插入图片描述


内联函数特性

  • inline是在编译阶段直接函数调用替换为函数体,也就是一种以空间换时间的方法
    • 好处:少了调用开销
    • 缺点:会使目标文件变大
  • inline对于编译器只是一个建议,实现机制取决于编译器。
    • 如果是递归函数、较大的函数编译器会忽略inline
  • inline不建议声明与定义相分离,因为可能会导致链接错误
    • 这是因为inline没有产生函数地址在变量列表中。
// F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i)
{cout << i << endl;
}
// main.cpp
#include "F.h"
int main()
{f(10);return 0;
}
// 链接错误:main.obj : error LNK2019: 无法解析的外部符号 "void __cdecl 
f(int)" (?f@@YAXH@Z),该符号在函数 _main 中被引用

内联函数意义

解决某一功能需要大量重复调用,造成栈频繁开辟销毁降低性能的问题。

在这里插入图片描述

一般来说,C语言解决这一问题是搞一个宏函数,虽然解决了问题,但是还有一些其他问题,比如语法复杂,不能调试,没有类型安全检查等等。C++为了解决这个问题,创建了新的语法,内联函数。

如果一个函数定义在了.h文件中该如何解决这个问题?
在这里插入图片描述
注:inline内敛,内联函数不会把其地址加载到符号表中,自然也不会引起链接错误。


内联函数的认识

那我们该如何看待或者使用内联函数的呢?
建议:

  在我看来内联函数就是为了解决体积小且大量重复的函数调用而诞生的,如果今后碰到一些大量重复调用且体积小的函数,可以考虑加上inline

  但是切忌不可每个函数都加上inline

  • 如果函数过大或者函数是递归函数的话 ---->编译器会忽略inline关键字
  • 如果体积过大会大大增加代码,从而造成“代码膨胀”的问题。

8.auto关键字

auto概念

是C++关键字之一,用来自动为变量匹配类型,而auto类型本质是一种新类型。

int TestAuto()
{
return 10;
}
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;
//auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化
return 0;
}

注:auto是一种类型声明时的“占位符”,编译器在编译期间会将auto替换为实际类型。

auto特性

  • auto使用必须初始化
  • auto与指针和引用结合起来使用
    用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则须加&
  • 在同一行定义多个变量
    当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
  • auto不能直接用来声明数组
  • auto过度使用会使可读性变差

auto意义

类型越来越复杂,难拼写,易出错 —> typedef —> auto
C语言中typedef的问题:
在这里插入图片描述


suto的认识

auto可以在面对较复杂的类型时候用一次,切忌不可连用,因为这会大大降低代码的可读性。

9.for的范围用法

在C++98中如果要遍历一个数组,可以按照以下方式进行:

void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
for(auto& e : array)e *= 2;
for(auto e : array)cout << e << " ";
return 0;
}

注意

  • or循环迭代的范围必须是确定的
    对于数组而言,就是数组中第一个元素和最后一个元素的范围
  • 迭代的对象要实现++和==的操作

10.NULL与nullptr

C++中NULL的问题

NULL的字面值是0,默认是int类型的,这会有bug存在。
在这里插入图片描述

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;
}

注:nullptr不需要包头文件,因为他是关键字,且在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。


EOF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/311245.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

处理json文件,并将数据汇总至Excel表格

从scores.jason文件中读取学生信息,输出学生的学号&#xff0c;姓名&#xff0c;各科成绩&#xff0c;平均分, 各科标准差 scores.jason {"学院": "计算机学院","班级": "2022级1班","成绩": [{"学号": 1001,&q…

【vue】绑定事件 v-on

v-on 简写&#xff1a; clickkeyupkeydownkeyup.wkeyup.ctrl.a <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

BK9534 博通BEKEN 无线麦克风芯片 提供配置工具软件

BK9534 芯片是在 BK9532 芯片基础上增加了一个内置MCU 来实现单芯片简单工作模式&#xff0c;内置己经固化了如开关机&#xff0c;对码&#xff0c;低电侦测&#xff0c;自动频率跟随等基本功能。另外还可以借助工具修改如频率&#xff0c;ID等相关配置信息. 1. 升级了接收芯片…

SpringBoot修改菜品模块开发

需求分析与设计 一&#xff1a;产品原型 在菜品管理列表页面点击修改按钮&#xff0c;跳转到修改菜品页面&#xff0c;在修改页面回显菜品相关信息并进行修改&#xff0c;最后点击保存按钮完成修改操作。 修改菜品原型&#xff1a; 二&#xff1a;接口设计 通过对上述原型图…

Midjourney常见玩法及prompt关键词技巧

今天系统给大家讲讲Midjourney的常见玩法和prompt关键词的一些注意事项&#xff0c;带大家入门&#xff5e;&#xff08;多图预警&#xff0c;建议收藏&#xff5e;&#xff09; 一、入门及常见玩法 1、注册并添加服务器&#xff08;会的童鞋可跳过&#xff5e;&#xff09; …

SpringBoot与MyBatisPlus的依赖版本冲突问题

记录使用SpringBoot和MyBatisPlus时遇到的版本冲突问题解决。 java版本&#xff1a;jdk17 废话&#xff1a;&#xff09;目前在IDEA中使用Spring官方的脚手架最低jdk版本竟然是jdk17了。 当使用SpringBoot3.0版本(3.2.4)&#xff0c;配合使用MP3.5.2版本时报错&#xff1a; Er…

H5代码video标签引入视频在浏览器的兼容性问题解决办法

H5标签video引入视频&#xff0c;在谷歌浏览器正常但是在火狐浏览器和版本较低的浏览器或者IE浏览器却无法观看视频&#xff0c;只能看到音频&#xff0c;是什么原因&#xff1f; 代码如下 <video class"video" muted loop"loop" style"display…

前端三剑客 —— JavaScript (第九节)

目录 内容回顾&#xff1a; 1.事件解除 2. Ajax jQuery选择器 回顾CSS选择器 CSS选择 1.基本选择器 2.包含选择器 3.伪类选择器 4.伪元素选择器 5.属性选择器 jQuery 库 jQuery 动画 系统动画 自定义动画 常见API操作 内容回顾&#xff1a; 1.事件解除 如果是使…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.3 月末操作:外币评估

2.6.3 月末操作&#xff1a;外币评估 企业的外币业务在记账时一般使用期初的汇率或者即时汇率&#xff0c;但在月末&#xff0c;需要按照月末汇率对外币的余额或者未清项进行重估&#xff08;revaluation&#xff09;。 企业在资产负债表日&#xff0c;应当按照下列规…

微信小程序全局配置

全局配置文件及常用的配置项 小程序根目录下的 app.json 文件是小程序的全局配置文件。常用的配置项如下&#xff1a; ① pages 记录当前小程序所有页面的存放路径 ② window 全局设置小程序窗口的外观 ③ tabBar 设置小程序底部的 tabBar 效果 ④ style 是否启用新版的组件样…

SpringBoot菜品分页查询模块开发(多表连接查询)

需要注意的地方 为什么创建VO类怎么进行多表连接查询分页查询的统一返回结果类PageResult分页查询Mapper的返回结果是Page<目标实体类> 需求分析与设计 一&#xff1a;产品原型 系统中的菜品数据很多的时候&#xff0c;如果在一个页面中全部展示出来会显得比较乱&…

华火电燃灶荣获国家级科技型中小企业

华火电燃灶作为一家国家级科技型中小企业&#xff0c;凭借其创新的技术和卓越的产品性能&#xff0c;在新能源厨电领域取得了显著的成就。华火&#xff0c;潜心钻研等离子电生明火技术近十年&#xff1b;华火电燃灶&#xff0c;电生明火&#xff0c;以“电”作为唯一能源&#…

创建影子用户

文章目录 1.认识影子用户2.创建隐藏账户并加入管理员组3.修改注册表3.删除用户4.添加管理员权限 1.认识影子用户 影子用户通常指的是那些在系统用户列表中不可见&#xff0c;但在某些情况下可以进行操作的用户。在内网渗透过程中&#xff0c;当我们拿到shell时&#xff0c;肯定…

uniapp--登录和注册页面-- login

目录 1.效果展示 2.源代码展示 测试登录 login.js 测试请求 request.js 测试首页index.js 1.效果展示 2.源代码展示 <template><view><f-navbar title="登录" navbarType="4"></f-navbar><view class="tips">…

碳课堂|碳关税是什么?企业如何从容应对?

2023年10月1日&#xff0c;欧盟碳边境调节机制&#xff08;CBAM&#xff09;法规&#xff0c;即全球首个“碳关税”开始实施。据世界银行研究报告称&#xff0c;如果“碳关税”全面实施&#xff0c;在国际市场上&#xff0c;中国制造可能将面临平均26%的关税&#xff0c;出口量…

李沐41_物体检测和数据集——自学笔记

边缘框 1.一个边缘框可以通过4个数字定义&#xff08;左上xy&#xff0c;右上xy&#xff0c;左下xy&#xff0c;右下xy&#xff09; 2.标注成本高 目标检测数据集 1.每行表示一个物体&#xff08;图片文件名、物体类别、边缘框&#xff09; 2.COCO&#xff1a;80物体、330…

前端跨域怎么办?

如果网上搜到的方法都不可行或者比较麻烦&#xff0c;可以尝试改变浏览器的设置&#xff08;仅为临时方案&#xff09; 1.新建一个Chrome浏览器的快捷方式 2.鼠标右键&#xff0c;进入属性&#xff0c;将以下命令复制粘贴到目标位置&#xff08;可根据Chrome实际存放位置修改…

数据结构之树的性质总结

节点的度&#xff1a;该节点拥有的孩子个数 叶子节点&#xff1a;度为0的节点 层数&#xff1a;根节点为第一层&#xff0c;根的子节点为第二层&#xff0c;以此类推 所有树的性质&#xff1a;所有节点的总度数等于节点数减一 完全m叉树性质 完全m 叉树&#xff0c;节点的…

【Hello算法】 > 第 2 关 >数据结构 之 数组与链表

数据结构 之 数组与链表 1&#xff1a;Understanding data structures &#xff01;——了解数据结构——1.1&#xff1a;Classification-分类-1.2&#xff1a;Type-类型- 2&#xff1a;Arrays are the bricks that make up the wall of data structures *——数组是组成数据结…

ActiveMQ介绍及linux下安装ActiveMQ

ActiveMQ介绍 概述 ActiveMQ是Apache软件基金下的一个开源软件&#xff0c;它遵循JMS1.1规范&#xff08;Java Message Service&#xff09;&#xff0c;是消息队列服务&#xff0c;是面向消息中间件&#xff08;MOM&#xff09;的最终实现&#xff0c;它为企业消息传递提供高…