美文网首页V语言
V语言学习笔记-06数组

V语言学习笔记-06数组

作者: lydiandy | 来源:发表于2020-05-19 16:06 被阅读0次

除了内置的基本类型外,数组和字典也是内置类型

数组实现

从数组的源代码实现看,也是一个struct

vlib/builtin/array.v

struct array {
pub: //公共只读
    data voidptr //数组的起始指针
    len int //数组的长度
    cap int //数组的容量
    element_size int //数组元素的字节大小
}
arr := [1,2,3,4,5]  //字面量定义数组
println(arr.data) //返回数组地址:0x7ff0d2c01270
println(arr.len)  //返回5
println(arr.cap)  //返回5
println(arr.element_size) //返回4

数组定义

根据首个元素的类型来决定数组的类型

[1, 2, 3]的数组类型是[]int

['a', 'b']的数组类型是[]string

数组元素的类型必须是一样的,不允许异构数组,[1, 'a'] 编译不会通过

定义固定长度的数组,然后赋值:

这种固定长度定义的数组,无法像字面量定义的那样,不能使用arr.len,无法使用<<追加元素

fn main() {
    mut arr:=[8]int //定义长度固定的数组,所有数组元素默认都是0值初始化
    println(arr[1]) //返回0
    arr=[0,1,2,3,4,5,6,7]!!  //注意数组后面有2个!!,否则会报错
    println(arr[1]) //赋值成功后,返回1
    println(arr[2]) //赋值成功后,返回2

    x := 2.32
    mut v := [8]f32
    println(v[1]) //返回0.000000
    v = [1.0, x, 3.0,4.0,5.0,6.0,7.0,8.0]!! 
    println(v[1]) //赋值成功后,返回2.320000
}

数组初始化

可以在定义数组时明确指定len,cap,init,进行初始化

module main

fn main() {
  //定义初始len为5,cap为20,初始值为10的数组
    mut arr := []int{len:5,cap:20,init:10} 
    println(arr) //输出[10, 10, 10, 10, 10]
    println('$arr.len,$arr.cap') //输出5,20
    arr << 3
    println(arr) //输出[10, 10, 10, 10, 10, 3]
}

定义一个指定长度,指定默认值的数组:

arr := [0].repeat(50) //元素初始值为0,长度为50,容量为50
println(arr.len) //返回50
println(arr.cap) //返回50
arr := ['a','b'].repeat(3) //元素初始值为a,b,重复3次,长度为6,容量为6
println(arr.len) //返回6
println(arr.cap) //返回6
println(arr) //返回['a','b','a','b','a','b']

数组的追加运算符: <<

可以把一个元素追加到数组中,也可以把一个数组追加到数组中

mut nums := [1, 2, 3]
println(nums) // "[1, 2, 3]"
nums << 4 //把一个元素追加到数组中
println(nums) // "[1, 2, 3, 4]"
mut nums := [1, 2, 3, 4]
println(nums) // "[1, 2, 3, 4]"
nums << [5, 6, 7] //把一个数组追加到数组中
println(nums) // "[1, 2, 3, 4, 5, 6, 7]"

指针类型数组:

mut arr := []&int
    a := 1
    b := 2
    c := 3
    arr << &a
    arr << &b
    arr << &c
  for i in arr {
    println(i) //输出数组的3个地址元素
  }

in操作符

判断元素是否在数组里

mut names := ['John']
names << 'Peter'
names << 'Sam'
println('Alex' in names) //false

!in操作符

in的反操作符,判断元素是否不在数组里

println('aa' !in names) //true

遍历数组

numbers := [1, 2, 3, 4, 5]
for num in numbers {
    println('num:$num')
}
for i,num in numbers {
    println('i:$i,num:$num')
}
//或者这种区间的写法也可以
for i in 0..numbers.len {
    println('num:${numbers[i]}')
}

数组切片/区间

左闭右开原则

n := [1,2,3,4,5]
println(n)
println(n[..2])  //返回[1, 2]
println(n[2..])  //返回[3, 4, 5]
println(n[2..4]) //返回[3, 4]

多维数组

维度的数量不仅仅于1,2维,不限

module main

fn main() {
    a := [1, 2, 3]
    b := [4, 5, 6]
    c := [7, 8, 9]
    d := [[a, b, c], [b, c, a], [c, a, b]]
    println(d) 
    println(d[0].len) //返回3
    println(d[0][0].len) //返回3
}

数组相关的源代码可以参考v源代码中的:vlib/builtin/array.v

更多数组相关的函数,参考标准库章节

相关文章

  • V语言学习笔记-06数组

    除了内置的基本类型外,数组和字典也是内置类型 数组实现 从数组的源代码实现看,也是一个struct vlib/bu...

  • 笨办法学golang(四)

    这是Go语言学习笔记的第四篇 Go语言学习笔记参考书籍「Go语言圣经」以及Go官方标准库 数组 数组是指一系列同类...

  • V语言学习笔记-总览

    最新版本学习笔记:github电子书 利用闲暇时间,体验了V语言,边看边动手记录,所以有了这个V语言学习笔记 写在...

  • 2018-05-23

    继续数组的学习。 指针的学习笔记和例题笔记 地址特殊的整型值不能用整型变量存储地址取地址符号& Include V...

  • (精)十天学会C语言(下)

    Day06 第06天C语言(00)笔记总结第06天C语言(01):进制转换-基本概念第06天C语言(02):进制转...

  • 数据结构与算法之美(二):数组

    本章内容源于笔者对极客时间《数据结构与算法之美》以下章节的学习笔记: 数组:为什么很多编程语言中数组都从0开始编号...

  • C语言学习06.数组

    一维数组 数组(Arrey):若干个相同类型数据的集合。 这些数据称为元素,通过下标作为唯一标识。数组名也是标识符...

  • V语言学习笔记-27单个V文件

    单个V文件 如果只是想写一个简单的程序,源代码可以放在单个V文件中,那么可以有更简单的写法 可以直接省略主模块,主...

  • TensorFlow学习笔记:Inception_v3源码分析

    TensorFlow学习笔记:Retrain Inception_v3(一) TensorFlow学习笔记:Ret...

  • V语言学习笔记-01模块

    V语言是一个非常模块化的语言 模块是代码重用,代码分发的基本单元 程序由模块组成,函数,结构体,常量,枚举等都要在...

网友评论

    本文标题:V语言学习笔记-06数组

    本文链接:https://www.haomeiwen.com/subject/trmbohtx.html