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

理解Go中的数组(Array)和切片(Slice)

引言

在Go中,数组切片是由有序的元素序列组成的数据结构。当需要处理许多相关值时,这些数据集非常适合使用。它们使你能够将本应放在一起的数据放在一起,压缩代码,并一次性对多个值执行相同的方法和操作。

尽管Go中的数组和切片都是有序的元素序列,但两者之间存在显著差异。Go中的数组是一种数据结构,由在创建时定义其容量的有序元素序列组成。一旦数组分配了大小,就不能再改变它的大小。另一方面,切片是数组的变长版本,为使用这些数据结构的开发人员提供了更大的灵活性。切片构成了其他语言中的数组。

考虑到这些差异,在某些特定情况下,您将使用其中一个。如果您是Go的新手,确定何时使用它们可能会令人困惑:尽管切片的多功能性使它们在大多数情况下是更合适的选择,但在某些特定情况下,数组可以优化程序的性能。

本文将详细介绍数组和切片,为您在选择这些数据类型时做出适当的选择提供必要的信息。此外,您还将回顾声明和使用数组和切片的最常见方法。本教程将首先描述数组以及如何操作它们,然后解释切片及其区别。

数组

数组是包含一定数量元素的集合数据结构。因为数组的大小是静态的,所以数据结构只需要分配一次内存,而变长数据结构必须动态分配内存,以便将来内存变得更大或更小。虽然数组的固定长度会让它们在使用时有些死板,但一次性分配内存可以提高程序的速度和性能。因此,开发人员在优化程序时,如果数据结构永远不需要可变数量的元素,通常会使用数组。

定义数组

数组是通过在方括号’[]'中声明数组的大小和元素的数据类型来定义的。Go中的数组必须具有相同的[数据类型]在数据类型之后,您可以在花括号{}中声明数组元素的单个值。

下面是声明数组的一般模式:

[capacity]data_type{element_values}

**注意:**重要的是要记住,每个新数组的声明都会创建一个不同的类型。因此,尽管[2]int[3]int都有整数元素,但它们不同的长度使它们的数据类型不兼容。

如果不声明数组元素的值,则默认值为0,这意味着数组中的元素将为空。对于整数,this用0表示,对于字符串,this用空字符串表示。

例如,下面的数组numbers有三个还没有值的整数元素:

var numbers [3]int

如果你打印numbers,你会得到以下输出:

Output[0 0 0]

如果想在创建数组时对元素的值进行赋值,可以将值放在大括号中。一个设置了值的字符串数组如下所示:

[4]string{"blue coral", "staghorn coral", "pillar coral", "elkhorn coral"}

你可以将数组存储在变量中,并将其打印出来:

coral := [4]string{"blue coral", "staghorn coral", "pillar coral", "elkhorn coral"}
fmt.Println(coral)
Output[blue coral staghorn coral pillar coral elkhorn coral]

请注意,在打印数组时,没有对数组中的元素进行划分,因此很难区分一个元素从哪里结束,另一个元素从哪里开始。因此,有时使用fmt.Printf函数是有帮助的,它可以在将字符串打印到屏幕上之前格式化字符串。为动词%q提供这个命令,指示函数在值周围加上引号:

fmt.Printf("%q\n", coral)
Output["blue coral" "staghorn coral" "pillar coral" "elkhorn coral"]

现在每个项目都被引用了。\n动词指示格式化程序在末尾添加一行返回。

有了如何声明数组及其组成的一般概念,你现在可以继续学习如何用索引号指定数组中的元素。

索引数组(和切片)

数组(以及切片)中的每个元素都可以通过索引来单独调用。每个元素对应一个索引数,它是一个从索引数0开始的int值。

在下面的例子中,我们将使用数组,但你也可以使用切片,因为它们的索引方式相同。

对于数组coral,索引分解如下所示:

“blue coral”“staghorn coral”“pillar coral”“elkhorn coral”
0123

第一个元素是字符串"blue coral",从索引0开始,切片以索引3结束,元素是"elkhorn coral"

因为切片或数组中的每个元素都有对应的索引号,所以我们能够以与其他顺序数据类型相同的方式访问和操作它们。

现在我们可以通过索引号来调用切片中的离散元素:

fmt.Println(coral[1])
Outputstaghorn coral

这个切片的索引号从0-3,如前一个表所示。因此,要单独调用任何元素,我们将像这样引用索引编号:

coral[0] = "blue coral"
coral[1] = "staghorn coral"
coral[2] = "pillar coral"
coral[3] = "elkhorn coral"

如果我们使用任何大于3的索引值来调用数组coral,它将超出范围,因为它将无效:

fmt.Println(coral[18])
Outputpanic: runtime error: index out of range

当索引数组或切片时,必须始终使用正数。与某些语言允许您使用负数反向索引不同,在Go中这样做将导致错误:

fmt.Println(coral[-1])
Outputinvalid array index -1 (index must be non-negative)

我们可以使用+操作符连接数组中的字符串元素或与其他字符串切片:

fmt.Println("Sammy loves " + coral[0])
OutputSammy loves blue coral

我们可以将索引为0的字符串元素与字符串"Sammy loves "连接起来。

通过索引号对应数组或切片中的元素,我们能够离散地访问每个元素并使用这些元素。为了演示这一点,我们接下来看看如何修改某个索引处的元素。

修改元素

我们可以通过将索引编号的元素设置为不同的值,来使用索引来更改数组或切片中的元素。这使我们能够更好地控制切片和数组中的数据,并允许我们以编程方式操作单个元素。

如果我们想要将数组coral中索引1处的元素的字符串值从"staghorn coral"改为"foliose coral",我们可以这样做:

coral[1] = "foliose coral"

现在当我们打印coral时,数组将会不同:

fmt.Printf("%q\n", coral)
Output["blue coral" "foliose coral" "pillar coral" "elkhorn coral"]

现在你已经知道了如何操作数组或切片中的单个元素,下面来看两个函数,它们能让你在处理集合数据类型时更加灵活。

使用len()计数元素

在Go中,len()是一个内置函数,用于帮助你处理数组和切片。与字符串一样,你可以使用len()并将数组或切片作为参数传递来计算数组或切片的长度。

例如,要找出coral数组中有多少个元素,你可以使用:

len(coral)

如果你打印数组 coral的长度,会得到以下输出:

Output4

这给出了数组4int数据类型的长度,这是正确的,因为数组coral有四个元素:

coral := [4]string{"blue coral", "foliose coral", "pillar coral", "elkhorn coral"}

如果你创建一个包含更多元素的整数数组,你也可以对其使用len()函数:

numbers := [13]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
fmt.Println(len(numbers))
Output13

尽管这些示例数组的项相对较少,但在确定非常大的数组中有多少元素时,len()函数特别有用。

接下来,我们将介绍如何将元素添加到集合数据类型中,并演示由于数组的长度是固定的,添加这些静态数据类型将导致错误。

append()添加元素

append()是Go中的一个内置方法,它可以将元素添加到集合数据类型中。但是,这个方法不适用于数组。如前所述,数组与切片的主要区别在于数组的大小不能修改。这意味着,虽然可以改变数组中元素的值,但不能在定义数组后使其变大或变小。

让我们考虑一下你的coral数组:

coral := [4]string{"blue coral", "foliose coral", "pillar coral", "elkhorn coral"}

假设你想将元素"black coral"添加到这个数组中。如果你尝试对数组使用append()函数,输入:

coral = append(coral, "black coral")
Outputfirst argument to append must be slice; have [4]string

为了解决这个问题,让我们学习更多关于切片数据类型的内容,如何定义切片,以及如何将数组转换为切片。

切片

切片是Go中的一种数据类型,它是一个可变的或可变的、有序的元素序列。由于切片的大小是可变的,因此在使用它们时具有更大的灵活性;在处理将来可能需要扩展或收缩的数据集合时,使用切片可以确保在试图操作集合的长度时不会出错。在大多数情况下,这种可变性是值得的,与数组相比,切片有时需要重新分配内存。当你需要存储大量元素或迭代元素,并希望能够随时修改这些元素时,你可能会想使用slice数据类型。

定义切片

切片是通过声明数据类型来定义的,数据类型之前是一组空的方括号([]),以及大括号({})之间的元素列表。你会注意到,与数组需要在括号中包含一个int来声明特定的长度不同,切片在括号中没有任何东西来表示它的可变长度。

让我们创建一个包含string数据类型元素的切片:

seaCreatures := []string{"shark", "cuttlefish", "squid", "mantis shrimp", "anemone"}

打印切片时,我们可以看到切片中的元素:

fmt.Printf("%q\n", seaCreatures)
Output["shark" "cuttlefish" "squid" "mantis shrimp" "anemone"]

如果你想创建一个特定长度的切片而不填充集合中的元素,你可以使用内置的make()函数:

oceans := make([]string, 3)
Output["" "" ""]

如果你想预分配一定容量的内存,你可以向make()传入第三个参数:

oceans := make([]string, 3, 5)

这将创建一个长度为3、预分配容量为5的零切片。

现在你知道如何声明切片了。然而,这还不能解决我们之前在coral数组中遇到的错误。要对coral使用append()函数,你首先需要学习如何对数组进行切片。

将数组切片

通过使用索引号来确定起点和终点,可以调用数组中值的分段。这被称为切片数组,你可以通过创建一个以冒号分隔的索引数字范围来做到这一点,形式为[==first_index==:==second_index==]。然而,重要的是要注意,在对数组进行切片时,结果是切片,而不是数组。

假设你想只打印coral数组的中间元素,不打印第一个和最后一个元素。你可以通过创建一个从索引1开始,在索引3之前结束的切片来实现:

fmt.Println(coral[1:3])
Output[foliose coral pillar coral]

在创建切片时,如[1:3],第一个数字是切片的起始位置(包括起始位置),第二个数字是第一个数字和你想要检索的元素总数的和:

array[starting_index : (starting_index + length_of_slice)]

在本例中,调用第二个元素(或索引1)作为起点,并总共调用了两个元素。计算如下:

array[1 : (1 + 2)]

这就是你如何得到这个符号的:

coral[1:3]

如果想将数组的开始或结束设置为切片的开始或结束点,可以省略array[==first_index==:==second_index==]语法中的一个数字。例如,如果你想打印数组coral的前三项——即"blue coral""foliose coral""pillar coral"——你可以输入:

fmt.Println(coral[:3])
Output[blue coral foliose coral pillar coral]

这打印了数组的开始部分,在索引3之前停止。

要在数组末尾包含所有元素,可以使用相反的语法:

fmt.Println(coral[1:])
Output[foliose coral pillar coral elkhorn coral]

本节讨论了如何通过切片调用数组的各个部分。接下来,你将学习如何使用切片将整个数组转换为切片。

将数组转换为切片

如果你创建了一个数组,并决定让它具有可变长度,则可以将其转换为切片。要将数组转换为切片,请使用本教程的slicing Arrays into Slices步骤中学习的切片过程,只不过这次通过省略两个决定端点的索引号来选择整个切片:

coral[:]

请记住,你不能将变量coral转换为切片本身,因为变量一旦在Go中定义,其类型就不能更改。要解决这个问题,可以将数组的整个内容以切片的形式复制到一个新变量中:

coralSlice := coral[:]

如果你打印coralSlice,你会收到以下输出:

Output[blue coral foliose coral pillar coral elkhorn coral]

现在,尝试像数组部分那样添加black coral元素,对新转换后的切片使用append():

coralSlice = append(coralSlice, "black coral")
fmt.Printf("%q\n", coralSlice)

这将输出添加了元素的切片:

Output["blue coral" "foliose coral" "pillar coral" "elkhorn coral" "black coral"]

我们也可以在一个append()语句中添加多个元素:

coralSlice = append(coralSlice, "antipathes", "leptopsammia")
Output["blue coral" "foliose coral" "pillar coral" "elkhorn coral" "black coral" "antipathes" "leptopsammia"]

要将两个切片组合在一起,你可以使用append(),但你必须扩展第二个参数以使用扩展语法:

moreCoral := []string{"massive coral", "soft coral"}
coralSlice = append(coralSlice, moreCoral...)
Output["blue coral" "foliose coral" "pillar coral" "elkhorn coral" "black coral" "antipathes" "leptopsammia" "massive coral" "soft coral"]

现在你已经学习了如何将元素添加到切片中,我们来看看如何删除一个元素。

从切片中删除元素

与其他语言不同,Go不提供任何从切片中删除元素的内置函数。需要通过切片的方式将项目从切片中移除。

要删除一个元素,必须切出该元素之前的元素,切出该元素之后的元素,然后将这两个新切片附加在一起,而不包含要删除的元素。

如果i是待删除元素的索引,则此过程的格式如下所示:

slice = append(slice[:i], slice[i+1:]...)

coralSlice中,移除"elkhorn coral"元素。这个元素位于3的索引位置。

coralSlice := []string{"blue coral", "foliose coral", "pillar coral", "elkhorn coral", "black coral", "antipathes", "leptopsammia", "massive coral", "soft coral"}coralSlice = append(coralSlice[:3], coralSlice[4:]...)fmt.Printf("%q\n", coralSlice)
Output["blue coral" "foliose coral" "pillar coral" "black coral" "antipathes" "leptopsammia" "massive coral" "soft coral"]

现在,索引位置3处的元素,即字符串"elkhorn coral",不再位于我们的切片coralSlice中。

我们也可以使用相同的方法删除范围。假设我们不仅要删除元素"elkhorn coral",还要删除"black coral""antipathes"。我们可以在表达式中使用范围来实现这一点:

coralSlice := []string{"blue coral", "foliose coral", "pillar coral", "elkhorn coral", "black coral", "antipathes", "leptopsammia", "massive coral", "soft coral"}coralSlice = append(coralSlice[:3], coralSlice[6:]...)fmt.Printf("%q\n", coralSlice)

这段代码将从切片中取出索引345:

Output["blue coral" "foliose coral" "pillar coral" "leptopsammia" "massive coral" "soft coral"]

现在你已经知道了如何在切片中添加和删除元素,让我们看看如何测量在任何给定时间切片可以容纳的数据量。

使用cap()测量切片的容量

由于切片的长度是可变的,因此len()方法不是确定这种数据类型大小的最佳选择。相反,你可以使用cap()函数来了解切片的容量。这将显示一个切片可以容纳多少个元素,这是由该切片已经分配了多少内存决定的。

**注意:**因为数组的长度和容量总是相同的,所以cap()函数对数组不起作用。

cap()的一个常见用途是使用预设的元素数量创建一个切片,然后以编程方式填充这些元素。这避免了使用append()添加超出当前分配容量的元素时可能发生的潜在不必要的分配。

假设我们想创建一个数字列表,03。我们可以在循环中使用append()来做到这一点,或者我们可以先预分配切片,然后使用cap()循环来填充值。

首先,我们来看看如何使用append():

numbers := []int{}
for i := 0; i < 4; i++ {numbers = append(numbers, i)
}
fmt.Println(numbers)
Output[0 1 2 3]

在这个例子中,我们创建了一个切片,然后创建了一个for循环,它将迭代四次。每次迭代都会将循环变量i的当前值添加到numbers切片的下标中。然而,这可能会导致不必要的内存分配,从而降低程序的速度。在给空切片添加容量时,每次调用append时,程序都会检查切片的容量。如果添加的元素使切片超过这个容量,程序将分配额外的内存来计算它。这会给程序带来额外的开销,并导致执行速度变慢。

现在让我们通过预先分配一定的长度/容量来在不使用append()的情况下填充切片:

numbers := make([]int, 4)
for i := 0; i < cap(numbers); i++ {numbers[i] = i
}fmt.Println(numbers)
Output[0 1 2 3]

在这个例子中,我们使用make()来创建一个切片,并让它预分配4个元素。然后,我们在循环中使用cap()函数迭代每个置零的元素,填充每个元素,直到达到预分配的容量。在每个循环中,我们将循环变量i的当前值放置到numbers切片的下标中。

虽然append()cap()策略在功能上是等效的,但cap()的例子避免了使用append()函数所需的任何额外内存分配。

构造多维切片

您还可以将由其他切片组成的切片定义为元素,每个方括号中的列表都包含在父切片的大括号中。这样的切片集合称为多维切片。这些可以被认为是描绘多维坐标;例如,一个由5个长为6个元素的切片组成的集合可以表示一个水平长度为5、垂直高度为6的二维网格。

让我们来看看下面的多维切片:

seaNames := [][]string{{"shark", "octopus", "squid", "mantis shrimp"}, {"Sammy", "Jesse", "Drew", "Jamie"}}

为了访问切片中的元素,我们需要使用多个索引,每个维度对应一个索引:

fmt.Println(seaNames[1][0])
fmt.Println(seaNames[0][0])

在上面的代码中,我们首先标识索引1处切片的索引0处的元素,然后标识索引0处切片的索引0处的元素。这将产生以下结果:

OutputSammy
shark

下面是其余各个元素的索引值:

seaNames[0][0] = "shark"
seaNames[0][1] = "octopus"
seaNames[0][2] = "squid"
seaNames[0][3] = "mantis shrimp"seaNames[1][0] = "Sammy"
seaNames[1][1] = "Jesse"
seaNames[1][2] = "Drew"
seaNames[1][3] = "Jamie"

在处理多维切片时,一定要记住,为了访问相关嵌套切片中的特定元素,需要引用多个索引号。

总结

在本教程中,您学习了在Go中使用数组和切片的基础知识。我们通过多个练习演示了数组的长度是固定的,而切片的长度是可变的,并发现了这种差异如何影响在不同情况下对这些数据结构的使用。

相关文章:

理解Go中的数组(Array)和切片(Slice)

引言 在Go中&#xff0c;数组和切片是由有序的元素序列组成的数据结构。当需要处理许多相关值时&#xff0c;这些数据集非常适合使用。它们使你能够将本应放在一起的数据放在一起&#xff0c;压缩代码&#xff0c;并一次性对多个值执行相同的方法和操作。 尽管Go中的数组和切…...

计算机毕业设计选什么题目好?springboot 高校学生综合测评管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…...

在liunx下读取串口的数据

1. 设置串口参数 首先是通过stty工具设置串口参数&#xff1a; sudo stty -F /dev/ttyUSB0 比特率 cs8 -cstopb如&#xff1a;sudo stty -F /dev/ttyUSB0 115200 cs8 -cstopb. 注意&#xff1a; 需要注意的是这里需要sudo权限&#xff1b; 2. 读取串口数据 然后读取串口的…...

Python中使用IDLE调试程序

在IDLE中&#xff0c;使用菜单栏中的“Debug”对IDLE打开的python程序进行调试。 1 打开调试开关 选择IDLE菜单栏的“Debug->Debugger”&#xff0c;如图1①所示&#xff1b;此时在IDLE中会显示“[DEBUG ON]”&#xff0c;即“调试模式已打开”&#xff0c;如图1②所示&am…...

发个地区和对应的价格方案

在当今数字化的世界中&#xff0c;网络工程师面临着各种挑战&#xff0c;从跨界电商到爬虫&#xff0c;从出海业务到网络安全&#xff0c;再到游戏领域。为了应对这些挑战&#xff0c;网络工程师需要了解并利用各种技术&#xff0c;其中Socks5代理和代理IP技术成为了他们的得力…...

启动Java应用的黑魔法:初始化性能解密@PostConstrut,InitialzingBean,init-method,BeanPostProcessor

我们在项目中经常会遇到启动时做一些逻辑的处理&#xff0c;比如配置信息的预加载&#xff0c;缓存信息的预加载等等&#xff0c;那都有哪些方法了&#xff0c;我们一起来探讨一下&#xff1a; 1. 方式 1. 构造方法初始化&#xff1a; 使用构造方法进行对象的基本属性初始化。…...

STM32-C语言结构体地址

定义2个结构体 typedef struct _demo_node_{ //结构体本身的地址struct _demo_node_* pprenode; //实际地址开始的位置&#xff0c;最下面的输出结果可以看出struct _demo_node_* pnextnode;unsigned long member_num;unsigned short age;char addr[0]; …...

Go HTTP 调用(下)

今天分享的内容是 Go HTTP 调用。如果本文对你有帮助&#xff0c;不妨点个赞&#xff0c;如果你是 Go 语言初学者&#xff0c;不妨点个关注&#xff0c;一起成长一起进步&#xff0c;如果本文有错误的地方&#xff0c;欢迎指出&#xff01; 前言 上篇文章 Go HTTP 调用&#…...

mysql5.7获取json数组中的某个对象

前言 表中的一个字段类型是字符串&#xff0c;存的是一个对象数据。 现在要根据对象中的某个属性&#xff0c;获取到整个对象信息。 如果是mysql8&#xff0c;则可以使用JSON_TABLE。 示例&#xff1a;https://blog.csdn.net/weixin_44071721/article/details/123347229 sele…...

PTE考试解析

Pte 考试题目 注入漏洞 空格被过滤 用/**/代替空格&#xff0c;发现#被过滤 对&#xff03;进行url编码为%23 输入构造好的payload http://172.16.12.100:81/vulnerabilities/fu1.php?id1%27)/**/and/**/11%23 http://172.16.12.100:81/vulnerabilities/fu1.php?id1%27)/*…...

UE4和C++ 开发-UE4怎么删除C++类

1 关闭visual stdio&#xff0c;关闭UE4引擎。 2 打开你的项目文件夹。找到你要删除的.h,.cpp文件删除。 3、删除Binaries文件夹。 4 右击.uproiect文件&#xff0c;点击Generate Visual Studio project files. 5 双击.uproiect文件,忽略警告打开就看到已经删除了想要删除的C类…...

基于图像识别的迁移学习之一

案例分析 加载数据部分同上一个案例&#xff0c;只需把数据输入到预训练的VGG-16或者ResNet50中。VGG-16的网络结构为右侧图绿色栏所示&#xff0c;其中block1中有2个包含64个卷积核的卷积层&#xff0c;block2包含2个128个卷积核的卷积层&#xff0c;block3有3个包含256个卷积…...

k8s使用

一、Kubernetes好处 ​ kubernetes&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本&#xff0c;于2014年9月发布第一个版本&#xff0c;2015年7月发布第一个正式版本。 ​ kubernetes的本质…...

HTML图片标签(2) HTML5+CSS3+移动web 前端开发入门笔记(三)

图片标签 HTML中&#xff0c;可以使用标签来插入图片。具体的语法为&#xff1a; <img src"图片路径" alt"替代文本">其中&#xff0c;src属性用于指定图片的路径&#xff0c;可以是相对路径或绝对路径。常见的有相对当前HTML文件的路径&#xff0…...

jwttoken+redis+springsecurity

思路 jwttoken不设置过期时间 redis管理过期时间&#xff0c;并且续签 redis中key"login:"userId, valuejwtUser 再次访问时&#xff0c;解析token中userId&#xff0c;并且根据过期时间自动续签JWT 实现登录认证 Token 自动续期方案 pom文件配置 <!--Redis--&…...

asp.net会议预约管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 会议预约管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 asp.net 会议预约管理系统 二、…...

十六、【橡皮擦工具组】

文章目录 橡皮擦背景橡皮擦1. 一次取样2. 连续取样3. 取样背景色板 魔术橡皮擦 橡皮擦 橡皮擦跟我们平常生活中所用的橡皮擦是一样&#xff0c;它是将图层的内容擦除,只剩下空白部分。另外当我们按住Alt的键去擦除空白部分的时候&#xff0c;也可以将背景的部分显示出来。 另…...

BAT学习——计算当前路径下指定格式文件的MD5值,将文件名与MD5值写入文本

将以下内容粘贴到bat脚本中&#xff0c;双击运行&#xff0c;生成MD5.txt文件&#xff0c;需要其他格式&#xff0c;修改循环中的.rar 多个格式使用or分开 *.rar or *.bat脚本内容 echo off setlocal enabledelayedexpansionrem 设置输出文件名 set "outputFileMD5.txt&…...

排序算法(stable_sort(), sort())

sort函数我相信大家都不陌生&#xff0c;今天介绍一个新的排序算法stable_sort stable_sort&#xff1a;稳定排序算法&#xff0c;维持相等元素的原有顺序。 stable_sort 假如我们定义一个字符串数组 vector<string> words; //fox jumps over quick red slow the turtl…...

【atoi函数详解】

文章目录 一. 什么是atoi函数二. 模拟实现函数atoi三. 总结atoi 一. 什么是atoi函数 atoi函数是将常量字符串转化为整数 int atoi(const char str);* 注意&#xff1a;该函数的返回值为int&#xff0c;所以不能超过int范围&#xff0c;如果数字很大超过就会截断&#xff0c;返…...

字符串左旋 与 字符串旋转结果

字符串左旋 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 方法1 三步翻转法 要求:abcdef 左旋两个 整体逆序:fedcba左边逆序:cdef ba右边逆序:cdef ab #include<stdio.h> #include<…...

真人现在猫鼠躲猫猫游戏搭建流程:专业思考与深度思考

真人现在猫鼠躲猫猫游戏是种充满乐趣和挑战的团队竞技游戏。本文将从游戏规则设计、场地布置、技术实现和用户体验等方面&#xff0c;深入探讨人现在猫鼠躲猫猫游戏的搭建流程&#xff0c;并结合专业思考与深度思考&#xff0c;为游戏搭建提供全面指导。 一、游戏规则设计&…...

计算机导论实验——Linux基础入门

使用Xshell登录 Linux 主机 linux命令&#xff1a; cd&#xff1a;去哪里 pwd&#xff1a;在哪里 ls&#xff1a;查看当前有什么文件 mkdir&#xff1a;创建新目录 cp&#xff1a;复制 cat&#xff1a;连接或显示文件 rm&#xff1a;删除 mv&#xff1a;用于移动或重命名文件…...

服务运营 |摘要:学术+业界-近期前沿运筹医疗合作精选

推文作者&#xff1a;李舒湉 编者按 本文归纳整理了近期INFORMS Journal on Applied Analytics中的相关业界合作研究。 这些研究成果体现了运筹学在医疗健康领域实践的效果。文中的学术业界合作使用了不同的研究工具。第一篇文章使用仿真模型帮助诊所进行不同拥挤程度下诊所使用…...

基于Dockerfile创建镜像

基于现有镜像创建 1.首先启动一个镜像&#xff0c;在容器里做修改 docker create -it centos:7 /bin/bash #常用选项&#xff1a; -m 说明信息&#xff1b; -a 作者信息&#xff1b; -p 生成过程中停止容器的运行。 2.然后将修改后的容器提交为新的镜像&#xff0c;需要使用…...

架构实战关键知识点

1.维基百科的“系统”定义&#xff1a;https://zh.wikipedia.org/wiki/%E7%B3%BB%E7%B5%B1 2.维基百科的“软件模块”定义&#xff1a;https://zh.wikipedia.org/wiki/%E8%BB%9F%E9%AB%9 4%E6%A8%A1%E7%B5%84 3.维基百科的“软件组件”定义&#xff1a;https://zh.wikipedia.or…...

M1Mac开启x86_64命令行archlinux虚拟机的最佳实践(qemu)

categories: [Tips] tags: Linux MacOS 写在前面 UTM 虚拟机可以卸载了, 命令行才是永远滴神, M1 MacBook Air 又能再战了! 之前一直用 UTM 的虚拟化开启 x86_64 的 Linux 虚拟机的, 但是我发现 UTM 好像不是必须的, 只要有qemu 就可以了, 下面就看看如何不通过图形界面前端…...

深度神经网络压缩与加速技术

// 深度神经网络是深度学习的一种框架&#xff0c;它是一种具备至少一个隐层的神经网络。与浅层神经网络类似&#xff0c;深度神经网络也能够为复杂非线性系统提供建模&#xff0c;但多出的层次为模型提供了更高的抽象层次&#xff0c;因而提高了模型的能力。深度神经网络是一…...

系统架构设计:11 论湖仓一体架构及其应用

目录 一 湖仓一体(Lakehouse) 1 数据仓库 2 数据湖 3 数据仓库和数据湖 4 湖仓一体(Lakehouse)...

Linux系统编程_文件编程第1天:打开、写入、读取、关闭文件等编程

1. 文件编程概述&#xff08;399.1&#xff09; 内容超多&#xff1a; 文件系统原理及访问机制文件在内核中的管理机制什么是文件信息节点inode文件的共享文件权限&#xff0c;各种用户对其权限。。。。。。 应用为王&#xff0c;如&#xff1a; 账单游戏进度配置文件等 关心如…...