浅析Golang切片截取功能与C++的vector区别
作者:go_hzx 发布时间:2024-04-23 09:34:51
浅析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
猜你喜欢
- 我就废话不多说了,大家还是直接看代码吧~import datetime# 时间格式 .%f 毫秒## "%Y-%m-%dT%H:%
- 本文实例为大家分享了python样条插值的具体实现代码,供大家参考,具体内容如下import numpy as npimport panda
- 一般的多数据库支持在配置文件中如下: <connectionStrings> <add name="MyCmsC
- 咱们Python 集中营有一个专题就是分享一些有意思的东西,今天大概看了一下pygame的这个非标准库就想着使用它来做个小游戏-拼图。通过加
- 导语"盘子里最后一块肉给你 一 冰激凌的第一口给你 一手机最后的10%电量给你!"哈喽大家好!我是木木子,我要开始给大家
- 一: 删除LOG1:分离数据库 企业管理器->服务器->数据库->右键->分离数据库2:删除LOG文件3:附加数据库 企业管理器->服务器-
- 本文实例为大家分享了python七夕浪漫表白的具体代码,供大家参考,具体内容如下from turtle import *from time
- 《lnmp一键安装包》中需要获取ip地址,有2种情况:如果服务器只有私网地址没有公网地址,这个时候获取的IP(即私网地址)不能用来判断服务器
- 为什么训练误差比测试误差高很多?一个Keras的模型有两个模式:训练模式和测试模式。一些正则机制,如Dropout,L1/L2正则项在测试模
- 前言尝试用python语言写脚本是好的开始,证明我们有了自动化的思想,这对优秀的程序开发人员是很重要的,电子计算机本来就是要减少重复工作的。
- 目录1 作用2 安装3 所有要运行的命令都放在 manager.py 中4 三种方式 创建命令4.1 方式一 创建 Command子类4.2
- 负责为网页编程语言提供标准化服务的W3C组织(World Wide Web Consortium)近日开始修改超文本标记语言的定义,计划为该
- 在工作中出于某些原因,我们可能需要将变量保存下来,这样下次就可以直接去赋值而不用重新执行某些重复耗时的操作了,这里我们用到了Python的p
- 1、建立socket建立socket对象需要搞清通信类型和协议家族。通信类型指明了用什么协议来传输数据。协议的例子包括IPv4、IPv6、I
- python代码如下:import webbrowser as wbimport foliumif __name__ == '__m
- django可以在运行服务器时指定端口号python manage.py runserver 8080我们启动django开发服务器,输入命
- 如何对PHP程序中的常见漏洞进行攻击(下) 翻译:analysist(分析家) 来源:http://www.china4lert.org 如
- 在Mysql 中删除数据以及数据表非常的容易,但是需要特别小心,因为一旦删除所有数据都会消失。删除数据删除表内数据,使用delete关键字。
- pycharm确实要比Spyder功能全面,但是anaconda的环境配置实在太方便了,所以想take both,其实很简单,利用pycha
- Python实现新版正方系统滑动验证码识别算法和方案步骤一:点击数据分析点击滑动按钮,将发送一个请求到 /zfcaptchaLogin请求内