浅析Golang切片截取功能与C++的vector区别

 更新时间:2022年10月11日 15:10:36   作者:go_hzx  
这篇文章主要介绍了Golang中切片的截取功能与C++中的vector有什么区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

浅析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实现队列

到此这篇关于浅析Golang切片截取功能与C++的vector区别的文章就介绍到这了,更多相关Golang切片截取内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • GoLang中sql.Exec()报错解决办法

    GoLang中sql.Exec()报错解决办法

    这篇文章主要给大家介绍了关于GoLang中sql.Exec()报错的解决办法,文中通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • go:gin输出日志文件方式

    go:gin输出日志文件方式

    这篇文章主要介绍了go:gin输出日志文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Golang读写二进制文件方法总结

    Golang读写二进制文件方法总结

    使用 Golang 的 encoding/gob 包读写二进制文件非常方便,而且代码量也非常少,本文就来通过两个示例带大家了解一下encoding/gob的具体用法吧
    2023-05-05
  • GO语言实现简单TCP服务的方法

    GO语言实现简单TCP服务的方法

    这篇文章主要介绍了GO语言实现简单TCP服务的方法,实例分析了Go语言实现TCP服务的技巧,需要的朋友可以参考下
    2015-03-03
  • Go tablewriter库提升命令行输出专业度实例详解

    Go tablewriter库提升命令行输出专业度实例详解

    命令行工具大家都用过,如果是运维人员可能会编写命令行工具来完成各种任务,命令行输出的美观和易读性往往容易被忽视,很烂的输出会让人感觉不专业,本文将介绍Go语言中牛逼的实战工具tablewriter库,使你在命令行输出中展现出专业的一面
    2023-11-11
  • gtoken替换jwt实现sso登录的问题小结

    gtoken替换jwt实现sso登录的问题小结

    这篇文章主要介绍了gtoken替换jwt实现sso登录,主要介绍了替换jwt的原因分析及gtoken的优势,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • Go语言开发发送Get和Post请求的示例

    Go语言开发发送Get和Post请求的示例

    这篇文章主要介绍了Go语言开发发送Get和Post请求的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Go语言如何通过通信共享内存

    Go语言如何通过通信共享内存

    这篇文章主要为大家介绍了Go语言如何通过通信共享内存实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Go编程中常见错误和不良实践解析

    Go编程中常见错误和不良实践解析

    这篇文章主要为大家介绍了Go编程中常见错误和不良实践解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Go语言Handler详细说明

    Go语言Handler详细说明

    这篇文章主要介绍了Go语言Handler详细说明,Handler用于处理请求并给予响应。更严格地说,用来读取请求体、并将请求对应的响应字段(respones header)写入ResponseWriter中,需要的朋友可以参考下
    2022-04-04

最新评论