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

【C++初阶】C++入门(上)

C++的认识

①什么是C++?

​ C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。

​ 于是1982年,Bjarne Stroustrup(本贾尼)博士在C语言的基础上引入并扩充了面向对象的概念,发明了一 种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而 产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。

​ 所以说,C++是祖师爷在C语言的基础上,发明了C++语言,C++是兼容C语言的,C语言程序是可以在C++上运行的,而C++程序是不能在C语言上运行的,所以我们在学习C++语言时,最好把C语言学习一下,打好基础,以便于在后续的C++学习中事半功倍。

祖师爷的帅照:

②C++的发展阶段:

阶段内容
C with classes类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符重载等
C++1.0添加虚函数概念,函数和运算符重载,引用、常量等
C++2.0更加完善支持面向对象,新增保护成员、多重继承、对象的初始化、抽象类、静态成员以及const成员函数
C++3.0进一步完善,引入模板,解决多重继承产生的二义性问题和相应构造和析构的处理
C++98C++标准第一个版本,绝大多数编译器都支持,得到了国际标准化组织(ISO)和美国标准化协会认可,以模板方式重写C++标准库,引入了STL(标准模板库)
C++03C++标准第二个版本,语言特性无大改变,主要:修订错误、减少多异性
C++05C++标准委员会发布了一份计数报告(Technical Report,TR1),正式更名 C++0x,即:计划在本世纪第一个10年的某个时间发布
C++11增加了许多特性,使得C++更像一种新语言,比如:正则表达式、基于范围for循 环、auto关键字、新容器、列表初始化、标准线程库等
C++14对C++11的扩展,主要是修复C++11中漏洞以及改进,比如:泛型的lambda表 达式,auto的返回值类型推导,二进制字面常量等
C++17在C++11上做了一些小幅改进,增加了19个新特性,比如:static_assert()的文 本信息可选,Fold表达式用于可变的模板,if和switch语句中的初始化器等
C++20自C++11以来最大的发行版,引入了许多新的特性,比如:**模块(Modules)、协 程(Coroutines)、范围(Ranges)、概念(Constraints)**等重大特性,还有对已有 特性的更新:比如Lambda支持模板、范围for支持初始化等
C++23制定ing

③C++的重要性

下图数据来自TIOBE编程语言社区2023年-2024年最新的排行榜,在30多年的发展中,C/C++几乎一 致稳居前5。

image-20240312164720503

TIOBE 编程语言社区排行榜是编程语言流行趋势的一个指标,每月更新,这份排行榜排名基于互联网上有经验的程序员、 课程和第三方厂商的数量。排名使用著名的搜索引擎(诸如 Google、 MSN、Yahoo!、Wikipedia、YouTube 以及 Baidu 等)进行计算。

注意排名不能说明那个语言好,那个不好,每门编程语言都有适应自己的应用场景。

④C++在工作领域

  • 操作系统以及大型系统软件开发
  • 服务器端开发
  • 游戏开发
  • 嵌入式和物联网领域
  • 数字图像处理
  • 人工智能
  • 分布式应用

总结:C++语言可以有各种各样的商业编译器或专有领域编译器,但是由开源社区积极维护的免费编译器,始终都唾手可得。如C++宇宙编译器VS,这一切,加上C++与时俱进的实现更新,配套完善的标准跟进,都使得C++语言的生命力长盛不衰。

C++的学习是一个长期漫长的过程,一定不能急于求成,我们一起加油!


1.C++关键字

在C语言中关键字有32个,而C++中关键字有63个。下面画红圈圈的就是C++中新增的一些关键字,当然并没有圈完,这些关键字后续学习到了再说。

a99670ebd63fc6d8ca1fc87f4bff7dd7

2.命名空间

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。

在C语言中:

#include<stdio.h>
#include<string.h>
int strlen= 10;
int main()
{//strlen函数是存在于string.h头文件中printf("%d\n",strlen);//错误C2365 “strlen” : 重定义;以前的定义是“函数”return 0;
}

这里可以看出,在C语言中函数是不可以重新定义成变量,所以C++中就引入了namespace关键字,来解决这种命名冲突。

2.1 命名空间定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字(这个你随便取名字),然后接一对{}即可,{} 中即为命名空间的成员。

命名空间中可以定义变量/函数/类型

namespace CSJ
{ int rand = 10;//变量int Add(int left, int right)//函数{return left + right;}struct Node//结构体类型{struct Node* next;int val;};
}

命名空间还可以嵌套使用:

//test.cpp
namespace N1
{int a=10;int b=20;int Add(int left, int right){return left + right;}namespace N2{int c=30;int d=40;int Sub(int left, int right){return left - right;}}
}//同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
// 一个工程中的test.h和上面test.cpp中两个N1会被合并成一个
// test.h
namespace N1
{
int Mul(int left, int right){return left * right;}
}

注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。

2.2 命名空间使用

命名空间的使用有三种方式:

  • (一)加命名空间的名称及作用域限定符(::)

    像上述的使用rand变量就可以这样操作:

    int main()
    {printf("%d\n", CSJ::rand);return 0;    
    }
  • (二)使用using将命名空间中的某个成员引入

    using N1::b;
    int main()
    {printf("%d\n", N1::a);printf("%d\n", b);return 0;    
    }
  • (三)使用using namespace命名空间名称引入

using namespace N1;
int main()
{printf("%d\n", N1::a);printf("%d\n", b);Add(10, 20);return 0;    
}注意:在上述的嵌套的命名空间中,如果要使用N2中的变量,函数等时,必须先把N1的空间先打开,再把N2的空间打开,才能使用N2空间中的内容。```cpp
namespace N1
{int a=10;int b=20;int Add(int left, int right){return left + right;}namespace N2{int c=30;int d=40;int Sub(int left, int right){return left - right;}}
}
using namespace N1;
using namespace N2;//而且使用命名空间,必须在定义命名空间的下面才行
int main()
{printf("%d\n", d);return 0;
}

3.C++输入&输出

在C语言中我们对于输入和输出使用的是scanf和printf,头文件是<stdio.h>。而对于C++的输入和输出,它们存在于iostream库中,iostream库中包含两个基础类型istreamostream,分别表示输入流和输出流。cin就是标准输入,cout就是标准输出

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
//cout,cin,endl这些都是存放在std的命名空间中
using namespace std;
int main()
{cout<<"Hello world!!!"<<endl;//endl是换行的意思,相当于C语言中的\n
return 0;
}

C++的输入输出比较于C语言的输入输出,还具有一些优势,在C语言中你的输入输出还需要指定变量的类型,而C++的输入输出可以自动识别变量类型。这里可以提供一个关键字typeid,可以得到变量的类型。

#include<iostream>
using namespace std;
int main()
{int a;double b;char c;cin >> a;cin >> b >> c;//>>是流提取运算符,<<是流插入运算符cout << a << endl;cout << b << " " << c << endl;cout << "a:" << typeid(a).name() << endl;cout << "b:" << typeid(b).name() << endl;cout << "c:" << typeid(c).name() << endl;return 0;
}

image-20240313171842586

std命名空间的使用惯例:

std是C++标准库的命名空间,如何展开std使用更合理呢?

1.在日常练习中,建议直接using namespace std即可,这样就很方便。

2.using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。

该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。

4.缺省参数

4.1 缺省参数概念

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

void Func(int a = 0)
{cout<<a<<endl;
}
int main()
{Func();     // 没有传参时,使用参数的默认值,打印0出来Func(10);   // 传参时,使用指定的实参,打印10出来 return 0;
}

4.2 缺省参数分类

  • 全缺省参数(顾名思义:函数的参数全给缺省值)

    void Func(int a = 10, int b = 20, int c = 30){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}
  • 半缺省参数

    void Func(int a, int b = 10, int c = 20){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}

**注意:**半缺省参数,只能从右往左给缺省值,不能间隔写。比如:

void Func(int a=10, int b , int c = 20)//这样写就是错误的

还有缺省参数不能在函数声明和定义中同时出现,而且缺省参数必须是常量或者全局变量。

  // a.hvoid Func(int a = 10);// a.cppvoid Func(int a = 20){}// 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。

5.函数重载

5.1 函数重载的概念

众所周知:C语言中的函数名称是不能相同的,而C++为了解决这个问题,于是函数重载就被发明出来了。

**函数重载:**在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。

1.参数类型不同:

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

2.参数个数不同

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

3.参数类型顺序不同

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

这几个函数你都可以传入不同的参数来调用它们。

image-20240313200501958

6.引用

6.1 引用概念

引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。**编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。**就好比我们给一个人取了一个外号,我们叫他真名和这个外号都是这个人。

#include<bits/stdc++.h>
int main()
{int a = 10;int& ra = a;//ra就是引用了变量aprintf("%p\n", &a);printf("%p\n", &ra);//这里的地址打印出来都是一样的,如下图所示return 0;
}

image-20240314104727005

注意:这里的引用类型必须和引用实体是相同类型,两个都为int,或者两个都为double等。

6.2 引用特性

  1. 引用在定义时必须初始化

  2. 一个变量可以有多个引用

  3. 引用一旦引用一个实体,再不能引用其他实体

    #include<bits/stdc++.h>
    int main()
    {int a = 20;int b = 10;//1.引用在定义的时候必须初始化//int& r;   //报错:“r” : 必须初始化引用	//2.一个变量可以有多个引用int& ra = a;int& rra = a;//3.引用一旦引用一个实体,再不能引用其他实体int& ra = b;//错误return 0;
    }
    

    关于引用在定义时必须初始化的原因:一般在初始化变量时,初始值会被拷贝到新建的对象中。然而定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另一个对象,因此引用必须初始化。

6.3 常引用

我们把引用绑定到const对象上,就像绑定到其他对象上一样,我们称之为对常量的引用,简称常引用

int main()
{const int a = 10;//int& r1 = a;//报错:ci为常量,“初始化” : 无法从“const int”转换为“int& ”	const int& r2 = a;double b= 20;//int& r3 = b;//报错:类型不同,“初始化” : 无法从“double”转换为“int & ”	const int& r4 = b;//那为什么这个又能行呢?return 0;
}

对于**double b=20,const int& r4 = b,**为什么可以,此处 r4 引用了一个int型的数。对 r4 的操作应该是整数运算,但 b 却是一个双精度浮点数而非整数。因此为了确保让 r4 绑定一个整数,编译器把上述代码变成了如下形式:

const int temp=b;//由双精度浮点数生成一个临时的整型变量
const int &r4=temp;//让r4绑定这个临时量

6.4 使用场景

  • 引用做参数

    //1.值传递(形参只是实参的一份临时拷贝,形参交换并不会影响实参,故而交换函数不成功)
    void Swap(int left, int right) 
    {int temp = left;left = right;right = temp;
    }//2.引用传递(如果形参为引用类型,则形参是实参的别名,进而交换函数成功)
    void Swap(int& left, int& right)
    {int temp = left;right = left;left = temp;
    }
    //3.指针传递(传入的是地址,因为地址是唯一的,所以指针通过地址的访问进而可修改其内容)
    void Swap(int* left, int* right)
    {int temp = *left;*left = *right;*right = temp;
    }
    
  • 引用做返回值

    int& Count()
    {int n = 10;return n;
    }

对于引用做返回值我们需要注意,如下面的代码:

int& Add(int a, int b)
{int c = a + b;return c;
}
int main()
{int& ret = Add(1, 2);std::cout << "Add(1, 2) is :" << ret << std::endl;return 0;
}
//这里我们以为1+2=3,所以结果就是3,那结果是什么呢?

image-20240314172206392

这里可以看出,得到了一个很奇怪的数。这是因为Add函数里面定义了C变量,而C的作用域只限定于Add函数里面,出了函数,C的空间就已经还给操作系统了,你自然没法引用了。

6.5 传值、传引用效率比较

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

所以这里我们就比较一下传值和传引用的效率:

  • 以函数参数比较两者
#include <time.h>
struct A { int a[10000]; };
void TestFunc1(A a) {}
void TestFunc2(A& a) {}
void TestRefAndValue()
{A a;// 以值作为函数参数size_t begin1 = clock();for (size_t i = 0; i < 10000; ++i)TestFunc1(a);size_t end1 = clock();// 以引用作为函数参数size_t begin2 = clock();for (size_t i = 0; i < 10000; ++i)TestFunc2(a);size_t end2 = clock();// 分别计算两个函数运行结束后的时间cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}
int main()
{TestRefAndValue();return 0;
}

image-20240314174018872

#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;
}
int main()
{TestReturnByRefOrValue();return 0;
}

image-20240314174313868

通过上述代码的比较,发现**传值和传引用(指针)在作为传参以及返回值类型上效率相差很大。**但是在传引用作为返回值时,就像上面说的,一点要注意变量的生命周期。

6.6 引用和指针的区别

引用在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。(上面已经把地址拿出来比较了,确实是)

在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

int main()
{int a = 10;int& ra = a;a = 20;int*pa = &a;*pa = 20;return 0;
}

e73c4911f8d5cded06062adfcc259287

这里我们可以看出,引用和指针的反汇编代码是一样的。即验证了引用是指针方式来实现的。

引用和指针的不同点:

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

相关文章:

【C++初阶】C++入门(上)

C的认识 ①什么是C&#xff1f; ​ C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。 ​ 于是1982年&#xff0c;Bjarne Stroustrup&#xff08;本…...

Vue.js+SpringBoot开发校园疫情防控管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生2.2 老师2.3 学校管理部门 三、系统展示四、核心代码4.1 新增健康情况上报4.2 查询健康咨询4.3 新增离返校申请4.4 查询防疫物资4.5 查询防控宣传数据 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBoot…...

客服销冠偷偷用的提效神器!无广很实用

近期发现我的同事每天上班必登录的一款软件——客服宝聊天助手&#xff0c;用过才发现&#xff1a;真客服办公的提效神器&#xff01;感兴趣的小伙伴请往下看~一、客服宝的简介&#xff1a;客服宝聊天助手&#xff0c;是一款跨平台快捷回复工具。自带多种功能&#xff0c;有效帮…...

蓝桥杯刷题|02入门真题

[蓝桥杯 2022 省 B] 刷题统计 题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目&#xff0c;周六和周日每天做 b 道题目。请你帮小明计算&#xff0c;按照计划他将在第几天实现做题数大于等于 n 题? 输入格式 输入一行包含三个整数…...

Jenkins cron定时构建触发器

from&#xff1a; https://www.jenkins.io/doc/book/pipeline/syntax/#cron-syntax 以下内容为根据Jenkins官方文档cron表达式部分翻译过来&#xff0c;使用机翻加个人理解补充内容&#xff0c;包括举例。 目录 介绍举例&#xff1a;设置方法方法一&#xff1a;方法二&#xf…...

【编程向导】JavaScript-创建对象一期讲解

工厂模式 工厂模式 是用来创建对象的一种最常用的设计模式。工厂模式不暴露创建对象的具体逻辑&#xff0c;而是将逻辑封装在一个函数中&#xff0c;那么这个函数就可以被视为一个工厂。工厂模式常见于大型项目&#xff0c;例如 jQuery 的 $ 对象&#xff0c;我们创建选择器对…...

【MySQL性能优化】- 一文了解MVCC机制

MySQL理解MVCC &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff…...

性能测试-Redis

一、测试注意点 1、缓存预热 如果程序初次运行&#xff0c;此时由于数据尚未加载到缓存&#xff0c;则程序的响应时间会明显变长 注意事项&#xff1a; 性能测试的时候 出现 非常不稳定的现象程序刚启动&#xff0c;它的性能 明显 低于 已经运行一段时间的 1.1 测试缓存没…...

浅析C++的指针与引用

浅析C的指针与引用 文章目录 浅析C的指针与引用一、对比引用与指针二、引用左值引用右值引用引用折叠 三、指针与引用的性能差距总结 一、对比引用与指针 总论&#xff1a; 引用指针必须初始化可以不初始化不能为空可以为空不能更换目标可以更换目标 引用必须初始化&#xff…...

【消息队列开发】 实现消息删除逻辑

文章目录 &#x1f343;前言&#x1f332;实现步骤&#x1f6a9;检验参数的合法性&#x1f6a9;读取Message数据&#x1f6a9;二进制转为message&#x1f6a9;isValid 设置为无效&#x1f6a9;写入文件&#x1f6a9;更新统计文件&#x1f6a9;特别注意&#x1f6a9;完整代码 ⭕…...

【golang】28、用 httptest 做 web server 的 controller 的单测

文章目录 一、构建 HTTP server1.1 model.go1.2 server.go1.3 curl 验证 server 功能1.3.1 新建1.3.2 查询1.3.3 更新1.3.4 删除 二、httptest 测试2.1 完整示例2.2 实现逻辑2.3 其他示例2.4 用 TestMain 避免重复的测试代码2.5 gin 框架的 httptest 一、构建 HTTP server 1.1…...

296.【华为OD机试】污染水域 (图的多源BFS—JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-污染水域二.解题思路三.题解代码Python题解代码…...

C语言——动态内存分配

前言&#xff1a;通过前面的学习&#xff0c;我们知道C语言中在内存中开辟空间的方法有&#xff1a;变量和数组。既然拥有了开辟空间的方法&#xff0c;我们为什么还要学习动态内存分配呢&#xff1f; int val 20; //在内存中开辟四个字节的空间 int arr[10] { 0 }; //在内…...

瑞_23种设计模式_策略模式

文章目录 1 策略模式&#xff08;Strategy Pattern&#xff09;★1.1 介绍1.2 概述1.3 策略模式的结构1.4 策略模式的优缺点1.5 策略模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析&#xff08;Comparator&#xff09; &#x1f64a…...

使用 OpenAI 的 text-embedding 构建知识向量库并进行相似搜索

OpenAI的embedding模型的使用 首先第一篇文章中探讨和使用了ChatGPT4的API-Key实现基础的多轮对话和流式输出&#xff0c;完成了对GPT-API的一个初探索&#xff0c;那第二步打算使用OpenAI的embedding模型来构建一个知识向量库&#xff0c;其实知识向量库本质上就是一个包含着一…...

设计模式学习笔记 - 规范与重构 - 5.如何通过封装、抽象、模块化、中间层解耦代码?

前言 《规范与重构 - 1.什么情况下要重构&#xff1f;重构什么&#xff1f;又该如何重构&#xff1f;》讲过&#xff0c;重构可以分为大规模高层重构&#xff08;简称 “大型重构”&#xff09;和小规模低层次重构&#xff08;简称 “小型重构”&#xff09;。大型重构是对系统…...

YOLOv9实例分割教程|(二)验证教程

专栏地址&#xff1a;目前售价售价59.9&#xff0c;改进点30个 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 一、验证 打开分割验证文件&#xff0c;填入数据集配置文件、训练好的权重文件&…...

python 基础知识点(蓝桥杯python科目个人复习计划63)

今日复习内容&#xff1a;做题 例题1&#xff1a;蓝桥骑士 问题描述&#xff1a; 小蓝是蓝桥王国的骑士&#xff0c;他喜欢不断突破自我。 这天蓝桥国王给他安排了N个对手&#xff0c;他们的战力值分别为a1,a2,...,an&#xff0c;且按顺序阻挡在小蓝的前方。对于这些对手小…...

IAB视频广告标准《数字视频和有线电视广告格式指南》之 简介、目录及视频配套广告 - 我为什么要翻译介绍美国人工智能科技公司IAB系列(2)

写在前面 谈及到中国企业走入国际市场&#xff0c;拓展海外营销渠道的时候&#xff0c;如果单纯依靠一个小公司去国外做广告&#xff0c;拉渠道&#xff0c;找代理公司&#xff0c;从售前到售后&#xff0c;都是非常不现实的。我们可以回想一下40年前&#xff0c;30年前&#x…...

Python网络基础爬虫-python基本语法

文章目录 逻辑语句if,else,elifforwhile异常处理 函数与类defpassclass 逻辑语句 熟悉C/C语言的人们可能很希望Python提供switch语句&#xff0c;但Python中并没有这个关键词&#xff0c;也没有这个语句结构。但是可以通过if-elif-elif-…这样的结构代替&#xff0c;或者使用字…...

产品推荐 - 基于星嵌 OMAPL138+国产FPGA的DSP+ARM+FPGA三核开发板

1 评估板简介 基于TI OMAP-L138&#xff08;定点/浮点DSP C674xARM9&#xff09; FPGA处理器的开发板&#xff1b; OMAP-L138是TI德州仪器的TMS320C6748ARM926EJ-S异构双核处理器&#xff0c;主频456MHz&#xff0c;高达3648MIPS和2746MFLOPS的运算能力&#xff1b; FPGA…...

【微服务学习笔记(一)】Nacos、Feign、Gateway基础使用

【微服务学习笔记&#xff08;一&#xff09;】Nacos、Feign、Gateway基础使用 总览Nacos安装配置Nacos注册中心服务多级存储模型负载均衡规则环境隔离 配置管理配置拉取配置热更新多服务共享配置 Feign远程调用配置性能优化Fegin使用 统一网关Gateway搭建网关路由断言工厂&…...

使用maven打生产环境可执行包

一、程序为什么要打包 程序打包的主要目的是将项目的源代码、依赖库和其他资源打包成一个可执行的文件或者部署包&#xff0c;方便程序的发布和部署。以下是一些打包程序的重要理由&#xff1a; 方便部署和分发&#xff1a;打包后的程序可以作为一个独立的实体&#xff0c;方便…...

springboot+ssm基于vue.js的客户关系Crm管理系统

系统包含两种角色&#xff1a;管理员、用户&#xff0c;主要功能如下。 ide工具&#xff1a;IDEA 或者eclipse 编程语言: java 数据库: mysql5.7 框架&#xff1a;ssmspringboot都有 前端&#xff1a;vue.jsElementUI 详细技术&#xff1a;springbootSSMvueMYSQLMAVEN 数据库…...

github 中的java前后端项目整合到本地运行

前言: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…...

分布式ID(7):Zookeeper实现分布式ID生成

1 原理 实现方式有两种,一种通过节点,一种通过节点的版本号 节点的特性持久顺序节点(PERSISTENT_SEQUENTIAL) 他的基本特性和持久节点是一致的,额外的特性表现在顺序性上。在ZooKeeper中,每个父节点都会为他的第一级子节点维护一份顺序,用于记录下每个子节点创建的先后顺序…...

钉钉小程序 - - - - - 如何通过一个链接打开小程序内的指定页面

方式1 钉钉小程序 scheme dingtalk://dingtalkclient/action/open_mini_app?miniAppId123&pagepages%2Findex%2Findex%3Fx%3D%25E4%25B8%25AD%25E6%2596%2587 方式2 https://applink.dingtalk.com/action/open_mini_app?type2&miniAppIdminiAppId&corpIdcorpId&…...

Java代码基础算法练习---2024.3.14

其实这就是从我学校的资源&#xff0c;都比较基础的算法题&#xff0c;先尽量每天都做1-2题&#xff0c;练手感。毕竟离我真正去尝试入职好的公司&#xff08;我指的就是中大厂&#xff0c;但是任重道远啊&#xff09;&#xff0c;仍有一定的时间&#xff0c;至少要等我升本之后…...

3月14日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 5.5G通信网络在海南投入商用&#xff0c;较5G提升10倍 &#x1f30d; 国务院批复同意&#xff0c;珠海港口岸将整合并扩大开放 &#x1f30b; 同有科技&#xff1a;正在研究新型磁电存储技术 &#x1f381; 美国折扣零售…...

学习Android的第二十八天

目录 Android Service (服务) 线程 Service (服务) Service 相关方法 Android 非绑定 Service startService() 启动 Service 验证 startService() 启动 Service 的调用顺序 Android 绑定 Service bindService() 启动 Service 验证 BindService 启动 Service 的顺序 …...