C++基础(5) - 复合类型(上)
文章目录
- 数组
- 1、什么是数组
- 2、数组的声明
- 3、数组的初始化
- 4、数组的访问
- 5、二维数组
- 6、`memset` —— 给数组中每一个元素赋同样的值
- 字符串(字符数组)
- 1、`string.h` 头文件
- 1.1 `strlen()`
- 1.2 `strcmp()`
- 1.3 `strcpy()`
- 1.4 `strcat()`
- string 类简介
- 1、C++11 字符串初始化
- 2、赋值、拼接和附加
- 3、`string` 头文件
- 3.1 `string` 中内容的访问
- 3.2 `string` 的比较
- 3.3 `length()/size()`
- 3.4 `insert()`
- 3.5 `erase()`
- 3.6 `clear()`
- 3.7 `substr()`
- 3.8 `string::npos`
- 3.9 `find()`
- 3.10 `replace()`
- 结构体
- 1、结构体的定义和使用
- 2、结构体变量的初始化
- 3、结构体数组
- 共用体
- 1、什么是共用体
- 2、共用体的用途
- 枚举
- 1、枚举的定义
- 2、枚举的使用
- 3、设置枚举量的值
- 4、枚举的取值范围
数组
1、什么是数组
数组是一种数据格式,能够存储多个同类型的值。
数组的特点:
- 数组中的元素按线性方式排列,可以通过编号来访问数组中的每个元素;
- 每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素;
2、数组的声明
要创建数组,可使用声明语句。数组声明应指出以下三点:
- 存储在每个元素中的值的类型;
- 数组名;
- 数组中的元素个数;
格式为:数据类型 数组名[数组大小];
注意:数组大小必须是整数常量,不可以是变量。
3、数组的初始化
-
C++ 允许在声明语句中初始化数组元素,只需提供一个用逗号分隔的值列表(初始化列表),并将它们用花括号括起来,可省略等号(=);
int arr[4] = {3, 6, 8, 10}; int arr[4] {3, 6, 8, 10}; // C++11 新增 -
只有在定义数组时才能使用初始化,此后就不能使用了,也不能将一个数组赋给另一个数组;
int arr[4] = {3, 6, 8, 10}; // 正确int hand[4]; hand[4] = {3, 6, 8, 10}; // 错误 hand = arr; // 错误 -
初始化数组时,提供的值可以少于数组的元素数目。如果对数组的一部分进行初始化,则编译器将把其他元素设置成0。若想初始化数组为0,则只需要显式将第一个元素初始化为0即可;
int arr[4] = {3, 6}; // 第1个元素3,第2个元素6,其他元素为0 int arr[4] = {0}; // 所有元素初始化为0 int arr[4] = {}; // C++11新增,所有元素初始化为0 -
如果初始化数组时方括号内(
[])为空,C++ 编译器将计算元素个数;int arr[] = {3, 6, 8, 10}; // 编译器会自动识别元素个数为4 -
列表初始化禁止缩窄转换;
long plifs[] = {25, 92, 3.0}; // 错误,浮点数转换为整型是缩窄操作 char slifs[4] = {'h', 'i', 1122011, '\0'}; // 错误,1122011超过了char变量的取值范围 char tlifs[4] = {'h', 'i', 112, '\0'}; // 正确,虽然112是一个int值,但在char类型的取值范围
4、数组的访问
int arr[indx];;
其中 indx 为数组的索引(下标),范围为 0 ~ length-1;数组长度 length = sizeof(arr) / sizeof(int)。这里的 sizeof 之前的文章介绍过,它返回变量或数据类型的字节个数。因为 arr 为 int 型数组,里面每一个元素都是 int 类型,所以 sizeof(arr) 表示所有元素的字节数,sizeof(int) 表示一个元素的字节数,两者之商就是元素的个数。
注意:如果数组大小较大(大概 10610^6106 级别),则需要将其定义在主函数外面,否则会使程序异常退出。因为函数内部申请的局部变量来自系统栈,允许申请的空间较小;而函数外部申请的全局变量来自静态存储区,允许申请的空间较大。
5、二维数组
- 声明二维数组
数据类型 数组名[m][n];
m 表示二维数组有多少个一维数组,n 表示每个一维数组的元素个数。

-
二维数组初始化
创建二维数组时,可以初始化其所有元素,二维数组初始化是建立在一维数组初始化技术的基础之上:提供由逗号分隔的用花括号括起的值列表。
int scores[3][4] = {{},{},{} };注意:二维数组的行数个数必须全部用大括号指定,不能省略,否则编译出错!【例如上面的
scores数组,我省略三个大括号中的一个是不行的】
6、memset —— 给数组中每一个元素赋同样的值
给数组中每一个元素赋相同的值有两种方法:memset 和 fill;
memset 函数的格式为:memset(数组名, 值, sizeof(数组名));。需要引入 string.h 头文件。
只建议初学者为数组赋 0 或 -1。因为 memset 使用的是按字节赋值,并不是按元素赋值,很容易出错。如果想按元素赋值,可以使用 fill 函数,此时需要引入 algorithm 头文件。
字符串(字符数组)
-
字符串是存储在内存连续字节中的一系列字符,又可以称为字符数组;
-
C++ 处理字符串有两种方式,一种是 C 语言风格,另一种是基于 string 类;
-
可以将字符串存储在 char 数组中,每个字符都位于自己的数组元素中;
-
C 语言风格的字符串是以空字符结尾(空字符被写作
\0,ASCII 码为 0),用来标记字符串的结尾。处理字符串的函数都是根据空字符的位置,而不是数组长度来进行处理;存储字符串 “Kitty” 的情况为:
char name[6] = {'K', 'i', 't', 't', 'y', '\0'}; -
字符数组初始化为字符串,可以使用双引号(
"")将字符串内容括起来【仅限于初始化,程序其他位置不允许这样直接赋值整个字符串】;char name[16] = "Hello Kitty"; char name[] = "Kitty"; -
注意字符常量和字符串常量的区别;
'S'是字符常量,"S"是字符串常量,存储的是['S', '\0']。
1、string.h 头文件
1.1 strlen()
strlen(字符数组):获得字符数组中第一个 \0 之前的字符个数。
1.2 strcmp()
strcmp(字符数组1, 字符数组2):返回两个字符串大小的比较结果,比较规则是字典序。
- 字符数组1 < 字符数组2:返回一个负整数;
- 字符数组1 < 字符数组2:返回一个正整数;
- 字符数组1 < 字符数组2:返回0;
1.3 strcpy()
strcpy(字符数组1, 字符数组2):把字符数组2复制到字符数组1,覆盖复制,这里的复制还包括结束符 \0。
1.4 strcat()
strcat(字符数组1, 字符数组2):把字符数组2拼接到字符数组1后面,两者之间的结束符会被覆盖。
string 类简介
除了使用字符数组之外,还可以使用 string 来存储字符串,而且 string 使用起来会比字符数组要简单。
要使用 string,必须包含头文件 string。
1、C++11 字符串初始化
C++11 允许将列表初始化用于 C 风格字符串和 string 对象:
char first_data[] = {"Hello World"};
char second_data[] = {"The Elegant Plate"};
string third_data = {"Hello World"};
string third_data {"Hello World"};string str = {'h', 'e', 'l', 'l', 'o'};
string str = "hello world";
2、赋值、拼接和附加
-
不能将一个数组直接赋给另一个数组,但是可以将一个
string对象直接赋给另一个string对象;char ch[20] = "hello"; string str = "world";char ch1[20]; ch1 = ch; // 错误!! string str1; str1 = str; // 正确!! -
string简化了合并操作,可以使用运算符+来将两个string对象合并起来,还可以使用+=运算符。string str2 = str + str2; string str += str2;
3、string 头文件
虽然 string 类也可以使用 C 中的头文件 string.h,但是 C++ 为了更好地使用 string,也提供了自己的 string 操作函数。
3.1 string 中内容的访问
-
直接像数组那样通过下标访问 string;
string str = "abc"; cout << str[0] << endl; // 要读入或输出整个字符串,只能使用 cin 和 cout// 还可以用 c_str() 将 string 类型转换为字符数组,然后用 printf 输出 printf("%s\n", str.c_str()); -
通过迭代器访问;
string str = "abc"; string::iterator it = str.begin(); // 上一句为了简便,还可以写成: auto it = str.begin();
3.2 string 的比较
两个 string 类型可以直接使用 关系运算符 进行比较,比较规则是字典序!
3.3 length()/size()
str.length()/str.size():返回字符串 str 的长度,即存放的字符数;
3.4 insert()
str.insert(pos, string):在字符串str的pos号位置插入字符串string;str.insert(it, it1, it2):it为原字符串欲插入的位置,it1和it2为待插字符串的首尾迭代器,用来表示子串[it1, it2)将被插入到it的位置上;
3.5 erase()
str.erase(it):删除迭代器it所在位置的元素;str.erase(begin, end):删除一个区间[begin, end)内的所有元素;str.erase(pos, length):pos为开始删除的其实位置,length为删除的字符个数;
3.6 clear()
str.clear():清空 string 中的数据;
3.7 substr()
str.substr(pos, length):返回从 pos 号位开始、长度为 length 的子串;
3.8 string::npos
一个常数,其本身的值为 -1,但由于是 unsigned_int 类型,因此实际上也可以被认为是 unsigned_int 类型的最大值。string::npos 用来作为 find 函数失配时的返回值。
3.9 find()
str.find(str1):当str1是str的子串时,返回其在str中第一次出现的位置;如果不是,则返回string::npos;str.find(str1, pos):从str的pos号位开始匹配str1,返回值与上相同;
3.10 replace()
str.replace(pos, length, str1):把str从pos号位开始、长度为length的子串转换为str1;str.replace(it1, it2, str1):把str的迭代器[it1, it2)范围的子串替换为str1;
结构体
结构体是由一批不同类型数据组合而成的一种新的数据类型,组成结构体数据的每个数据称为结构体的“成员”(域、元素),通常用来表示类型不同但是又相关的若干数据。
1、结构体的定义和使用
struct 结构体名字 {char name[20]; // 一些基本的数据结构或者自定的数据类型int age;...
}[结构体变量1, 结构体变量2, ...]; // [] 中的是可选项
结构体里面可以定义除了自己之外的任何数据类型,因为定义自己本身会引起循环定义的问题,但是可以定义自身类型的指针变量。
-
假设结构体名字为
student,依次创建结构体类型的变量:struct student stu, *stup; // stu 为结构体变量,stup 为结构体指针变量,两者访问变量方式不同 student stu; -
访问结构体类型变量成员:
cout << stu.name; // 普通变量的访问方式 cout << stup->name; // 指针变量的访问方式
2、结构体变量的初始化
使用逗号分隔值列表,并将这些值用花括号括起来,值之间用逗号分开:
student stu = {"cat", 19};
student stu {"dog", 18};
student stu {};
3、结构体数组
-
可以创建元素为结构体的数组,方法和创建基本类型数组完全相同:
student stus[20]; cin >> stus[0].name; cout << stus[19].age << endl; -
结构体数组初始化:
student stus[2] = {{"cat", 19},{"dog", 18} };
共用体
1、什么是共用体
共用体(联合体)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。例如一个共用体中定义了 int 和 double 类型的变量,存储了 int 型数据之后,再存储 double 型数据,此时 int 型数据会丢失。
union one4two{int id_int;long id_long;};one4two pail;pail.id_int = 3;cout << pail.id_int << endl; // 3pail.id_long = 3000;cout << pail.id_long << endl; // 3000cout << pail.id_int << endl; // 3000
共用体的句法与结构体相似,但是含义不同,共用体的长度为其最大成员的长度:
union one4all
{char char_val;short short_val;int int_val; // one4all 的长度就是 int 类型的长度
};
2、共用体的用途
共用体的用途之一是,当数据项使用两种或更多种格式(但不会同时使用)时,可节省空间。
假设管理一个小商品目录,其中有一些商品的ID为整数,而另外一些的ID为字符串:
struct widget
{char brand[20];int type;union id{long id_num;char id_char[20];} id_val;
};
...
widget prize;
...
if (prize.type == 1) {cin >> prize.id_val.id_num;
} else {cin << prize.id_val.id_char;
}
匿名共用体(anonymous union)没有名称,其成员将成为位于相同地址处的变量。显然,每次只有一个成员是当前的成员:
struct widget
{char brand[20];int type;union{long id_num;char id_char[20];};
};
...
widget prize;
...
if (prize.type == 1) {cin >> prize.id_num;
} else {cin >> prize.id_char;
}
由于共用体是匿名的,因此 id_num 和 id_char 被视为 prize 的两个成员,它们的地址相同,所以不需要用中间标识符 id_val 。程序员负责确定当前哪个成员是活动的。
共用体常用于(但并非只能用于)节省内存。
枚举
前文提到过符号常量,使用 const 和 #define 进行定义。C++ 的枚举类型 enum 提供了另一种创建符号常量的方式,可以代替 const,它还允许定义新类型。
1、枚举的定义
enum 枚举名 {枚举量1, 枚举量2, ...};// 例子如下:red为0,依此类推,数值加1。即 orange 为1,yellow 为2,...
enum colors {red, orange, yellow, green, blue, purple};
2、枚举的使用
// 使用枚举名声明该类型的变量
colors band;// 只能将定义枚举时使用的枚举量赋值给这种枚举的变量
band = red;
// band = 5; // 错误!!// 可以通过强制类型转换,将有效的 int 值转换成枚举量
band = colors(4);// 枚举量是整型,可被提升为 int 类型,但 int 类型不能自动转换为枚举类型
int col = blue;
col = 3 + red;
3、设置枚举量的值
-
可以使用赋值运算符来显式地设置枚举量地值,指定地值必须是整数:
enum bits{one = 1, two = 2, four = 4, eight = 8}; -
也可以只显式地定义其中一些枚举量的值:
enum bigstep{first, second = 100, third}; // first 为0,third 为101first默认情况下为0,后面没有初始化的枚举量的值比其前面的枚举量大1,third的值为101。 -
可以创建多个值相同的枚举量:
enum{zero, null = 0, one, numero_uno = 1}; // 这里 zero 也为0,one 也为1
4、枚举的取值范围
-
每个枚举都有取值范围,通过强制类型转换,可以将取值范围中的任何整数赋值给枚举变量,即使这个值不是枚举值:
enum bits{one = 1, two = 2, four = 4, eight = 8}; bits myflag = bits(6); -
枚举取值范围:
-
上限:寻找第一个大于枚举量最大值的2的幂次方,上限就是这个值减1;
例如最大枚举量为
101,第一个大于它的是 27=1282^7 = 12827=128,所以上限就是 128−1=127128 - 1 = 127128−1=127。 -
下限:枚举量最小值为0,则下限为0;否则寻找第一个小于它的2的幂次方,加上1;
例如最小枚举量为
-6,第一小于它的是 −23=−8-2^3 = -8−23=−8,因此下限为 −8+1=−7-8 + 1 = -7−8+1=−7。
-
相关文章:
C++基础(5) - 复合类型(上)
文章目录数组1、什么是数组2、数组的声明3、数组的初始化4、数组的访问5、二维数组6、memset —— 给数组中每一个元素赋同样的值字符串(字符数组)1、string.h 头文件1.1 strlen()1.2 strcmp()1.3 strcpy()1.4 strcat()string 类简介1、C11 字符串初始化…...
java重写(@Override)介绍及实例说明
1.概述方法的重写(override)是封装的特性之一。在子类中可以根据需要对基类中继承来的方法进行重写。重载和重写没有任何关系。作用:通过重写,子类既可以继承父类的东西,又可以灵活的扩充。1.override注解是告诉编译器…...
基于STM32的虚拟示波器
仓库地址 https://github.com/shuai132/ScopeMCU ScopeMCU Oscilloscope for MCU MCU: STM32F103C8Tx 需配合ScopeGUI使用 截图说明见wiki 最新版Releases Introduction 用最少的硬件成本,做一个实用的虚拟示波器。 这是硬件部分,基于STM32最小…...
搭建云端vscode-server,使用web ide进行远程开发
使用乌班图系统,搭建自己的网页vs code开发环境github地址:GitHub - coder/code-server: VS Code in the browser安装脚本curl -fsSL https://code-server.dev/install.sh | sh出现deb package has been installed.表示已经正确安装。测试启动2.1修改配置…...
Linux clock子系统及驱动实例
文章目录基本概念CLK子系统时钟API的使用clock驱动实例1、时钟树2、设备树3、驱动实现fixed_clk固定时钟实现factor_clk分频时钟实现gate_clk门控时钟实现基本概念 晶振:晶源振荡器 PLL:Phase lock loop,锁相环。用于提升频率 OSC:…...
GIS数据格式坐标转换(地球坐标WGS84、GCJ-02、火星坐标、百度坐标BD-09、国家大地坐标系CGCS2000)
文章目录前言一、坐标系1.地球坐标 (WGS84)2.国测局坐标系(GCJ-02、火星坐标系)3.百度坐标(BD-09)4.国家大地2000坐标系(CGCS2000)二、百度坐标系(BD-09) 与火星坐标系(GCJ-02)的转换1.核心代码2.转换验证百度地图高德地图腾讯地图三、火星坐标系 (GCJ-02) 与百度坐标系 (BD-09…...
流媒体传输系列文章汇总
流媒体传输系列文章汇总 文章目录流媒体传输系列文章汇总引言流媒体交互协议详解视频封装协议详解流媒体环境搭建其他引言 从去年开始编写有关流媒体传输相关知识的文章,已发表文章22篇,阅读量也超过了10万,为了方便各位阅读,本文…...
“万字“ Java I/O流讲解
Java I/O流讲解 每博一文案 谁让你读了这么多书,又知道了双水村以外还有一个大世界,如果从小你就在这个天地里,日出而作,日落而息。 那你现在就会和众乡亲抱同一理想:经过几年的辛劳,像大哥一样娶个满意的…...
数据库(Spring)事务的四种隔离级别
文章目录Spring(数据库)事务隔离级别分为四种(级别递减)1、Serializable(串行化)2、REPEATABLE READ(可重复读)3、READ COMMITTED(读以提交)4、Read Uncommit…...
RabbitMQ详解(一):RabbitMQ相关概念
RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用。作为一名合格的开发者,有必要对RabbitMQ有所了解,本系列是RabbitMQ快速入门文章,主要内容包括RabbitMQ是什么、RabbitMQ核心概念、五种消息模…...
ICLR 2023 | GReTo:以同异配关系重新审视动态时空图聚合
©PaperWeekly 原创 作者 | 周正阳单位 | 中国科学技术大学论文简介动态时空图数据结构在多种不同的学科中均普遍存在,如交通流、空气质量观测、社交网络等,这些观测往往会随着时间而变化,进而引发节点间关联的动态时变特性。本文的主要…...
线程池分享总结
线程池介绍 可以复用线程池的每一个资源 控制资源的总量 为什么要使用线程池 问题一:反复创建线程开销大 问题二:过多的线程会占用太多内存 解决以上两个问题的思路 • 用少量的线程——避免内存占用过多 • 让这部分线程都保持工作,且可…...
AOSP Android11系统源码和内核源码
推荐阅读 商务合作 安全产品 安全服务 2023年招聘 安全培训服务 软件定制服务 Android系统定制服务 安全/软件开发的课程列表 1.下载repo工具 (1).创建bin,并加入到PATH中 mkdir ~/binPATH~/bin:$PATH (2).安装依赖库 sudo apt-get install bison g-mult…...
layui框架学习(6:基础菜单)
菜单是应用系统的必备元素,虽然网页中的导航也能作为菜单使用,但菜单和导航的样式和用途有所不同(不同之处详见参考文献5)。Layui中用不同的预设类定义菜单和导航的样式,同时二者依赖的模块也不一样。本文主要学习和记…...
第十三届蓝桥杯 C++ B组省赛 C 题——刷题统计(AC)
1.刷题统计 1.题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 aaa 道题目, 周六和周日每天做 bbb 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 nnn 题? 2.输入格式 输入一行包含三个整数 a,ba,ba,b 和 nnn. 3.输出…...
C++中的多态
【1】表现形式:同样的调用语句有多种不同的表现形态 【2】分类:静态联编和动态联编 静态联编有函数重载(运算符重载是特殊的函数重载),模板 【3】重点说下动态联编 【3.1】动态联编的实现需要以下步骤: 有继承关系、父类函数有virtual关…...
Swift如何保证线程安全
Swift可以通过以下几种方式来保证线程安全 使用互斥锁(Mutex):使用互斥锁可以防止多个线程同时访问共享数据,保证线程安全。 使用OSAtomic操作:OSAtomic操作可以在多线程环境中安全地执行原子操作。 使用DispatchQue…...
整型提升+算术转换——“C”
各位CSDN的uu们你们好呀,今天小雅兰的内容是之前操作符那篇博客中没有讲完的内容,整型提升这个小知识点也非常重要,那现在,就让我们进入操作符的世界吧 隐式类型转换 算术转换 操作符的属性 隐式类型转换 表达式求值的顺序一部…...
Freemarker介绍
2. Freemarker介绍 FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML…...
【软件测试开发】Junit5单元测试框架
目录1. 注解Test 注解BeforeEach BeforeAllAfterEach AfterAll2. 断言 assertassertequalsassertTrue assertFalseassertNull assertNotNull3. 用例执行顺序方法排序,通过 Order 注解来排序4. 测试套件 Suite5. 参数化单参数stringsints6. 参数化多参数CsvSourceCsv…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
