标签:Golang,切片,截取,删除
浅析golang切片截取(删除)功能
1. 引言
golang的切片被认为是和C++的vector容器类似,都可以认为是动态数组,但又不完全一样。
那么区别到底在哪里呢?对元素的删除方式是很重要的一点区别
对于C++的vector来说,用erase函数来删除元素,其原理是将当前位置后面的元素都向前移动一位,删除一个元素的平均时间复杂度为O(n)
对于golang的slice来说,没有用来删除元素的函数,但是其可以通过改变指向底层数组的指针和append的方式巧妙的实现元素的删除,对头部元素和尾部元素删除时间复杂度都为O(1),所以可以用切片来模拟栈和队列,而C++用vector模拟队列的时间复杂度过高,C++队列的底层是deque,下文将利用代码进行具体分析
2.分析过程
2.1 s[:]的方式截取元素
可以利用s[1:]的方式来删除切片的第一个元素,产生的新切片仍旧与原切片共用一个底层数组,只是将底层数组的指针向后移动了一位。所以修改s2的元素,s1的元素也会改变。这一点是和vector最不同的,slice删除头部元素只需要O(1)的时间复杂度
func main() {
// 验证切片的截取功能
s1 := []int{1,2,3,4,5}
s2 := s1[1:]
fmt.Println("切片s1:",s1)
fmt.Println("切片s2:",s2)
s2[0] = 6
fmt.Println("修改s2的第一个元素后,切片s1:",s1)
fmt.Println("修改s2的第一个元素后,切片s2:",s2)
}
上面这段代码的输出结果为:
2.2 append的方式截取元素
用append截取s1得到s3。append截取的方式类似于erase,后面的元素会向前移动。但是由于s3和s2,s1共用一个底层数组,截取得到s3时,s1,s2的元素也会改变。对于中间元素的删除slice和vector时间复杂度相同
func main() {
// 验证切片的截取功能
s1 := []int{1,2,3,4,5}
s2 := s1[1:]
s3 := append(s1[0:2],s1[3:]...)
fmt.Println("切片s1:",s1)
fmt.Println("切片s2:",s2)
fmt.Println("切片s3:",s3)
s2[0] = 6
fmt.Println("修改s2的第一个元素后,切片s1:",s1)
fmt.Println("修改s2的第一个元素后,切片s2:",s2)
fmt.Println("修改s2的第一个元素后,切片s3:",s3)
}
输出结果为:
3. 结论
正是由于slice可以方便的删除头部元素和尾部元素,所以用其模拟栈和队列。而vector对于头部元素的删除复杂度太高,所以不建议用vector实现队列
来源:https://blog.csdn.net/qq_42290165/article/details/127180662
0
投稿
猜你喜欢
- 前言老旧或者破损的照片如何修复呢?本文主要分享一个博主使用后非常不错的照片恢复开源项目:Bringing-Old-Photos-Back-t
- ping的原理是发送一个ICMP请求包,然后根据目的地址的应答包来判断是否能够和这个主机进行通信。我们使用python实现,借助于scapy
- Python3 正则表达式正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。本文主要阐述re包中的主要函数。
- 一:模板的理解模板是将一个事物的结构规律予以固定化、标准化的成果。例如:网页的组成需要是html,head,body,你只要按照它的规则来写
- 本文实例讲述了Python实现查找系统盘中需要找的字符。分享给大家供大家参考。具体如下:'''Created on
- 在python中,普通的列表list和numpy中的数组array是不一样的,最大的不同是:一个列表中可以存放不同类型的数据,包括int、f
- 让我们描绘一下本文的情节:假设您要在本地机器上运行一个进程,而部分程序逻辑却在另一处。让我们特别假设这个程序逻辑会不时更新, 而您运行进程时
- 索引和切片相当于是对数组中内容的读(read)或者查询(inquiry)。是我们获取有用信息(demanded infomation)的重要
- 黑体是视觉设计师常用的一款字体,特别是针对广告的 Banner 等。根据 * 的相关介绍,有关黑体的定义可以认为:黑體与白体
- 来介绍一下 Python 是采用何种途径解决循环引用问题的。上图中,表示的是对象之间的引用关系,从自对象指向他对象的引用用黑色箭头表示。每个
- 目录项目地址:简介使用主要代码项目地址:https://github.com/king-xw/Face_Recogntion简介本仓库是使用
- 本文通过Python3+PyQt5实现《python Qt Gui 快速编程》这本书13章程序Rich文本的行编辑,可以通过鼠标右键选择对文
- 起步线上部署时因设置了 settings.DEBUG = False 会导致静态文件都是 404 的情况。主要原因是应为关闭DEBUG模式后
- 核心提示:本文针对mysql-noinstall版本,也就是解压缩版的安装配置应用做了个总结,这些操作都是平时很常用的操作。文章中不对mys
- 小编相信对于大多数熟悉Python的人来说,一定都听说并且使用过pip这个工具,但是对它的了解可能还不一定是非常的透彻,今天小编就来为大家介
- 一:使用Python中的urllib类中的urlretrieve()函数,直接从网上下载资源到本地,具体代码:import os,stati
- 本文实例为大家分享了基于信息增益的决策树归纳的Python实现代码,供大家参考,具体内容如下# -*- coding: utf-8 -*-i
- python 读写中文json的实例详解读写中文json想要 读写中文json ,可以使用python中的 json 库可以对j
- 版本:ant design vue 3.2.4场景:使用Image图片组件预览功能需求:自定义预览遮罩层及预览图片的样式;不得影响到其他页面
- idea git切换分支方法点击下方的git,checkout出要开发的分支切换多个分支后如何保maven正常idea 多个分支来回切换后会