首页 > 其他分享 >Rust学习笔记_16——Vector

Rust学习笔记_16——Vector

时间:2024-12-06 22:32:10浏览次数:9  
标签:mut 16 元素 Vector let vec Rust Vec

Rust学习笔记_13——枚举
Rust学习笔记_14——结构体
Rust学习笔记_15——Union


Vector

文章目录


在Rust编程语言中,Vec<T> 是标准库中提供的动态数组类型,它是最常用的数据结构之一。Vec<T> 是一个泛型类型,T 表示数组中元素的类型。

1. 创建Vector

  • 使用vec!

    let v: Vec<i32> = vec![1,2,3,4,5]
    

    vec!宏是一个方便的语法糖,用于初始化包含指定元素的Vec

  • 使用 Vec::new 方法

    let v: Vec<i32> = Vec:new();
    

    这将创建一个空的 VecVec::new 返回一个默认初始化的 Vec,没有分配任何内存空间。

  • 使用 Vec::with_capacity 方法

    let v: Vec<i32> = Vec:with_capacity(10);
    

    创建一个具有指定容量的 Vec,但它是空的。预先分配容量可以避免在添加元素时频繁地重新分配内存

2. 访问

通过索引访问元素

let v = vec![1, 2, 3, 4, 5];
let first = &v[0];
let second = &mut v[1];

索引访问可能会导致运行时错误(例如,如果索引超出范围),所以通常会使用 ResultOption 来处理这种情况

3. 修改元素

  • 通过push方法添加元素

    let mut v = Vec::new();
    v.psuh(1);
    v.push(2);
    
  • 通过insert方法在指定位置插入元素

    let mut v = vec![1,2,4];
    v.insert(2, 3);
    // [1,2,3,4]
    
  • 通过remove方法移除元素

    let mut v = vec![1, 2, 3, 4]
    let removed = v.remove(1)
    
    

4. 容量和长度

// 获取长度
let v = vec![1, 2, 3, 4, 5];
let len = v.len(); // 结果是 5

// 获取容量
let v = vec![1, 2, 3, 4, 5];
let capacity = v.capacity(); // 返回当前分配的容量

// 预留容量
let mut v = vec![1, 2, 3];
v.reserve(10); // 预留额外的 10 个元素的容量

// 收缩到适合容量
let mut v = vec![1, 2, 3, 4, 5];
v.shrink_to_fit();

5. 遍历

  • 使用 for 循环:
let v = vec![1, 2, 3, 4, 5];
for &x in &v {
    println!("{}", x);

}
  • 使用迭代器:
let v = vec![1, 2, 3, 4, 5];
for x in v.iter() {
    println!("{}", x);

}
  • 使用 enumerate 方法:
let v = vec![1, 2, 3, 4, 5];
for (i, &x) in v.iter().enumerate() {
    println!("Element at index {}: {}", i, x);
}

6. 内存安全

Rust 的 Vec<T> 是内存安全的,因为它在编译时确保了以下几点:

  • 边界检查:访问 Vec 元素时会进行边界检查,以防止越界访问。
  • 所有权Vec 遵循 Rust 的所有权规则,确保了内存不会被重复释放或未释放。
  • 不可变性:默认情况下,Vec 是不可变的,需要使用 mut 关键字来声明可变 Vec

7. 性能

  • 动态数组Vec<T> 底层实现为动态数组,因此在添加或移除元素时可能会涉及内存重新分配。然而,Rust 的内存分配器相对高效,且 Vec 提供了预留容量的方法来减少重新分配的次数。
  • 缓存友好:由于 Vec<T> 是连续存储的,所以它是缓存友好的,适合用于需要高效访问元素的数据结构。

标签:mut,16,元素,Vector,let,vec,Rust,Vec
From: https://blog.csdn.net/LuckyLay/article/details/144278131

相关文章

  • Rust学习笔记_11——函数
    Rust学习笔记_08——StringRust学习笔记_09——模式匹配Rust学习笔记_10——守卫函数文章目录函数1.函数定义2.示例3.函数同日中的表达式和语句4.参数4.1必选参数4.2可选参数4.3参数默认值5.高阶函数Rust语言中的函数是构成程序的基本模块,用于封装可......
  • Rust中Vec<u8>和&[u8]有什么区别
    Vec和&[u8]是Rust中两种表示字节序列的不同类型,它们的区别主要体现在所有权、可变性和内存管理等方面。定义与基本区别Vec•是动态可变数组,拥有自己的内存所有权。•可以动态扩展大小。•元素存储在堆上,Vec的容量可以超过实际长度。•当Vec被销毁时,它......
  • Rust包之once_cell
    在Rust中,once_cell是一个非常有用的crate,用于实现惰性初始化(lazyinitialization)的单例模式。它允许某些值只被初始化一次,并且之后始终保持不变。该功能在需要全局变量或延迟计算的情况下非常实用。关键概念线程安全(sync)与非线程安全(unsync)•OnceCell:适用于单线程......
  • 新手必看!小小白也能用Rust点亮LED,入门嵌入式开发(上)
    讲动人的故事,写懂人的代码"你作为编程新手,为什么要学Rust?"我在微信里问小小白。我是一名有着30多年IT从业经验的老程序员,正在创作一本Rust编程入门书,致力于降低Rust那传说中陡峭的学习曲线。小小白是我最近在社交网络上认识的朋友,他对学习Rust充满热情。作为一名......
  • 基于51单片机和16X16LED点阵屏(MAX7219驱动)的自制独立按键控制的小游戏《贪吃蛇》
    目录系列文章目录前言一、效果展示二、原理分析三、各模块代码1、定时器02、自制独立按键(8位)3、16X16LED点阵屏(MAX7219驱动)四、主函数总结系列文章目录前言《贪吃蛇》,一款经典的、怀旧的小游戏,单片机入门必写程序。基于51单片机和8X8LED点阵屏(板载74HC595驱动)的......
  • Golang教程第16篇(语言数组)
    Go语言数组Go语言提供了数组类型的数据结构。数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。相对于去声明number0,number1,…,number99的变量,使用数组形式numbers[0],numbers[1]…,......
  • 16-结构体
    16-结构体结构体可以让C语言创建出新的类型。/*创建一个学生类型*/structStu{ charname[20]; //名字 intage; //年龄 doublescore; //成绩};/*创建一个书的类型*/structBook{ charname[20]; //名字 floatprice; //价格 charid[30]; //书号};......
  • 洛谷题单指南-线段树-P1637 三元上升子序列
    原题链接:https://www.luogu.com.cn/problem/P1637题意解读:统计序列a[1]~a[n]中三元上升子序列的个数,三元上升子序列是指对于1<=i<j<k<=n有a[i]<a[j]<a[k],(a[i],a[j],a[k])成为一组上升子序列。解题思路:1、先思考一下暴力,通过三重循环枚举i,j,k找到所有i<j<k时符合a[i]<a[j]<a[k]......
  • 洛谷 P1651 塔(DP)
    题目传送门https://www.luogu.com.cn/problem/P1651解题思路设  表示前  个积木,两塔高度差为 (第一个比第二个高多少),的最大高度。易得:首先,不选当前的积木:其次,选当前积木,将它拼到第一个塔上:最后,选当前积木,将它拼到第二个塔上:由于,第二维可能为负数,所以,我们可以以 (数......
  • 大模型--数据类型FP16 BF16--29
    1.参考https://blog.csdn.net/voiiid/article/details/114825246https://blog.csdn.net/shizheng_Li/article/details/1441409122.半精度浮点fp16这两种数据类型编程是经常遇见双精度double,64位单精度float,32位FP16(Half-precisionfloating-pointformat)它提供更高的......