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

Rust动态数组Vec

文章目录

    • 初步示例
    • 创建动态数组
    • 增删改
    • 迭代

初步示例

Rust提供了动态数组这种数据类型,所谓动态,就是长度可变,示例如下

fn main(){
    let mut vec = Vec::new();
    for i in 1..5{
        vec.push(i);
    }
    for i in &vec{
        println!("{}", i);
    }
}

其中,push用于在末尾添加一个元素。

虽然名为动态数组,但从内存分配的角度来说,Vec中存在一个静态连续的内存区域,用以提高性能。这部分容量可通过capacity()来获取,而当前数组中元素个数,则用len()来得到。

fn main(){
    let v=vec![1,2,3];
    println!("len():{}", v.len());
    println!("capacity():{}", v.capacity());
    // 二者都是3
}

创建动态数组

在Rust中,除了通过Vec::new()创建一个空的动态数组之外,也支持指定元素创建

let v = vec![1, 2, 3];

通过with_capacity方法,可以创建一个指定容量的数组

fn main(){
    let mut v:Vec<i32> = Vec::with_capacity(10);
    println!("len():{}", v.len());
    println!("capacity():{}", v.capacity());
}

其长度为0,容量为10。

增删改

Vec提供了一系列添加、删除以及改动元素的方式

方法说明方法说明
pop弹出末尾的元素push在末尾添加元素
remove移除某个位置的元素insert在某个位置插入元素
append在结尾拼接一个数组
clear清空truncate截断
dedup移除相邻且重复的元素retain保留复合条件的值

其中,append输入参数为另一个引用的动态数组,如果想要引用自身,则需克隆一下。

fn main(){
    let mut v1 = vec![1, 2, 3];
    v1.append(&mut v1.clone());
    println!("{}", v1.len());
}

有关dedup的详细解读,可见Rust根据条件删除相邻元素

迭代

动态数组可直接通过for循环进行迭代,前面的示例中已经介绍了&v在迭代中的表现,但是,若想修改迭代中的值,则需通过&mut进行引用。这两种迭代方式,可分别对应iter()和iter_mut()。

fn main(){
    let mut v = vec![1, 2, 3];
    for i in &mut v{
        *i += 5;
    }
    for i in v.iter_mut(){
        *i *= 2;
    }
    for i in v.iter(){
        println!("{}", i);
    }
}

输出为 12 , 14 , 16 12,14,16 121416

Vec提供了一系列sort函数,其中最简单的是sort(),其功能是将数组从小到大进行排列。

fn main(){
    let mut v = [-5, 4, 1, -3, 2];
    v.sort();
    println!("{:?}", v);
}

运行结果为

[-5, -3, 1, 2, 4]

http://www.kler.cn/news/134297.html

相关文章:

  • Linux调试器---gdb的使用
  • Spark 平障录
  • c++中的特殊类设计
  • Linux——编译器gcc/g++、调试器gdb以及自动化构建工具makefilemake详解
  • 【数据库表及字段统计SQL】【mysql】【clickhouse】【oracle】
  • AIGC之Stable Diffusion
  • YOLOv8优化策略:轻量级Backbone改进 | VanillaNet极简神经网络模型 | 华为诺亚2023
  • Linux系统编程 day02 vim、gcc、库的制作与使用
  • 龙芯 Loongson 架构 UOS 系统编译 Qt 5.15.2 源码
  • boomYouth
  • 2023.11.18html中如何使用input/button进行网页跳转
  • GIT无效的源路径/URL
  • SOME/IP 协议介绍(五)指南
  • 基于灰狼算法(GWO)优化的VMD参数(GWO-VMD)
  • 【Proteus仿真】【STM32单片机】防火防盗GSM智能家居设计
  • Dockerfile自定义镜像以及案例分析
  • C++二分查找算法:找到 Alice 和 Bob 可以相遇的建筑
  • Python PyQt 程序设置图标
  • JS-项目实战-鼠标悬浮变手势(鼠标放单价上生效)
  • 【Linux】安全审计-audit
  • SpringBoot静态资源配置
  • Linux socket编程(4):服务端fork之僵尸进程的处理
  • ClickHouse UDF 运行速度慢问题
  • docker容器内访问主机端口服务
  • Visual Studio Code 从英文界面切换中文
  • 鸿蒙:实现两个Page页面跳转
  • 多线程概述
  • RTMP协议和源码解析
  • MFC/QT 一些快要遗忘的细节:
  • 本地Git项目同时推送至GitHub和Gitee