【05】RUST常用的集合函数宏类型

文章目录

  • 常用集合
    • Vec
    • String
    • HashMap
    • 打印
  • 类型
    • `Option<T>`

常用集合

Vec

  • 堆上连续内存
  • vector可能出现扩容,把老元素copy到内存新位置
    • 因此不允许let first = &v[0];作用域内调用v.push(4);
// 定义
let v: Vec<i32> = Vec::new();
let v = vec![1, 2, 3];	// 使用vec!宏定义// 增加元素
v.push(4);// 取数值
v[2]; // 下标索引
v.get(2); // 调用get// 越界时不会panic,会返回None
v.get(100);
v[100];// 遍历
for i in &v{// 不可变遍历元素println!("{i}");
}
for i in &mut v{// 可变遍历元素*i += 50;
}
// 融合枚举可以往vec中填充多种数据类型
enum SpreadsheetCell {Int(i32),Float(f64),Text(String),
}let row = vec![SpreadsheetCell::Init(3),SpreadsheetCell::Text("x_x"),SpreadsheetCell::Float(3.1415926),];

String

String字符串字面值str
let s = String:::new();let s = String::from("string");let s = "string".to_string();“string”let s1: &str = "hello";let s2 = String::from("world"); let s2_slice: &str = &s2;
堆分配的、可变的 UTF-8 字符串。本质是对 Vec 的封装,但保证内容为合法 UTF-8。用双引号 “…” 表示的硬编码字符串。对一段 UTF-8 字节序列的引用,通常以 &str 形式出现。

RUST中使用UTF-8编码,字符长度可变。

let mut  s = String::new();
let data = "initial contents";
let s = data.to_string(); // .to_string();用于任何实现了 Display trait 的类型
let s = "initial contents".to_string();
let mut s = String::from("foo");
s.push_str("bar");// push_str不获取所有权,为获取一个单独的字符作为参数,并附加到 String 中。
let mut s1 = String::from("foo");
let s2 = "bar";
s1.push_str(s2);
println!("s2 is {s2}");//s2依旧有效// + 获取了s1所有权fn add(self, s: &str) -> String {} 
let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = s1 + &s2; //这里&s2发生强制类型转换为&str
// 注意 s1 被移动了,不能继续使用//更为复杂的字符串链接,可以使用 format! 宏拼接
let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");
let s = format!("{s1}-{s2}-{s3}");// 索引字符串,不建议,UTF-8编码长度不固定,需要程序员确保正确// 遍历字符串
// 按照字符遍历 2 字符
for c in "Зд".chars() {println!("{c}");
}
// 按照字节遍历 4 字节
for b in "Зд".bytes() {println!("{b}");
}

HashMap

默认使用SipHash进行,可以抵御涉及哈希表(hash table)的拒绝服务(Denial of Service, DoS)攻击。

use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);// 根据key查询数值
let team_name = String::from("Blue");
let score = scores.get(&team_name).copied().unwrap_or(0);
// get返回Option<&V>
// 调用 copied 方法来获取一个Option<i32>,没有key时会返回 None
// 调用 unwrap_or 在 scores 中没有该键所对应的项时将其设置为零// 遍历数据
for (key, value) in &scores {println!("{key}: {value}");
}// 插入后所有权归HashMap所有
use std::collections::HashMap;
let field_name = String::from("Favorite color");
let field_value = String::from("Blue");
let mut map = HashMap::new();
map.insert(field_name, field_value);
// 这里 field_name 和 field_value 不再有// 多次插入,会新的覆盖老的。
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Blue"), 25);//Entry 的 or_insert 方法在键对应的值存在时就返回这个值的可变引用,如果不存在则将参数作为新值插入并返回新值的可变引用。
// entry只有在没有key的时候才进行插入
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.entry(String::from("Yellow")).or_insert(50);
scores.entry(String::from("Blue")).or_insert(50);
// 根据key已有的value更新
let mut map = HashMap::new();
for word in text.split_whitespace() {let count = map.entry(word).or_insert(0);*count += 1;
}

打印

  • dbg!()
    • 格式打印,()获取参数所有权,并返回表达式所有权。
    • 打印到标准错误控制台流stderr
  • println!()
    • ()接受引用
    • 打印到标准输出控制台流stdout

类型

Option<T>

  • 用于空值检查 (因为编译器会保证T类似一定非空值)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16376.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek模型架构及优化内容

DeepSeek v1版本 模型结构 DeepSeek LLM基本上遵循LLaMA的设计&#xff1a; 采⽤Pre-Norm结构&#xff0c;并使⽤RMSNorm函数. 利⽤SwiGLU作为Feed-Forward Network&#xff08;FFN&#xff09;的激活函数&#xff0c;中间层维度为8/3. 去除绝对位置编码&#xff0c;采⽤了…

内网ip网段记录

1.介绍 常见的内网IP段有&#xff1a; A类&#xff1a; 10.0.0.0/8 大型企业内部网络&#xff08;如 AWS、阿里云&#xff09; 10.0.0.0 - 10.255.255.255 B类&#xff1a;172.16.0.0/12 中型企业、学校 172.16.0.0 - 172.31.255.255 C类&#xff1a;192.168.0.0/16 家庭…

【图片合并转换PDF】如何将每个文件夹下的图片转化成PDF并合并成一个文件?下面基于C++的方式教你实现

医院在为患者进行诊断和治疗过程中&#xff0c;会产生大量的医学影像图片&#xff0c;如 X 光片、CT 扫描图、MRI 图像等。这些图片通常会按照检查时间或者检查项目存放在不同的文件夹中。为了方便医生查阅和患者病历的长期保存&#xff0c;需要将每个患者文件夹下的图片合并成…

香港中文大学 Adobe 推出 MotionCanvas:开启用户掌控的电影级图像视频创意之旅。

简介&#xff1a; 亮点直击 将电影镜头设计引入图像到视频的合成过程中。 推出了MotionCanvas&#xff0c;这是一种简化的视频合成系统&#xff0c;用于电影镜头设计&#xff0c;提供整体运动控制&#xff0c;以场景感知的方式联合操控相机和对象的运动。 设计了专门的运动条…

129,【2】buuctf [BJDCTF2020]EzPHP

进入靶场 查看源代码 看到红框就知道对了 她下面那句话是编码后的&#xff0c;解码 1nD3x.php <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;通常用于调试和展示代码结构 highlight_file(__FILE__); // 设置错误报告级别为 0&#xff0c;即不显示任何 PHP 错误信息…

MapReduce到底是个啥?

在聊 MapReduce 之前不妨先看个例子&#xff1a;假设某短视频平台日活用户大约在7000万左右&#xff0c;若平均每一个用户产生3条行为日志&#xff1a;点赞、转发、收藏&#xff1b;这样就是两亿条行为日志&#xff0c;再假设每条日志大小为100个字节&#xff0c;那么一天就会产…

LeetCode --- 435周赛

题目列表 3442. 奇偶频次间的最大差值 I 3443. K 次修改后的最大曼哈顿距离 3444. 使数组包含目标值倍数的最少增量 3445. 奇偶频次间的最大差值 II 一、奇偶频次间的最大差值I 统计字母出现次数&#xff0c;然后分别统计出现偶数次的最小值和出现奇数次的最大值&#xff0c;…

chrome-mojo C++ Bindings API

概述 Mojo C 绑定 API 利用C 系统 API提供一组更自然的原语&#xff0c;用于通过 Mojo 消息管道进行通信。结合从Mojom IDL 和绑定生成器生成的代码&#xff0c;用户可以轻松地跨任意进程内和进程间边界连接接口客户端和实现。 本文档通过示例代码片段提供了绑定 API 用法的详…

目标检测数据集合集(持续更新中)

第1期 高压输电线塔鸟巢数据集 第2期 特种工程车辆检测数据集 第3期 金桔目标检测数据集 第4期 金属锈蚀识别检测数据集 第5期 苦瓜目标检测数据集 第6期 石榴目标检测数据集YOLO格式 第7期 光伏电池板缺陷检测数据集YOLO格式 第8期 铁路轨道异物入侵检测数据集YOLO格式…

活动预告 | 为 AI 新纪元做好准备:助力安全的业务转型

课程介绍 随着现代办公模式的不断演变和 AI 技术的迅速发展&#xff0c;企业在享受效率提升的同时&#xff0c;也面临着信息安全与数据保护的严峻挑战。在利用 AI 技术释放业务潜力的同时&#xff0c;如何确保数据质量与安全已成为企业发展的关键议题。 在本次线上课程中&…

语义分割文献阅读——SETR:使用Transformer从序列到序列的角度重新思考语义分割

目录 摘要 Abstract 1 引言 2 Vision Transformer(ViT) 2.1 图片预处理&#xff1a;分块和降维 2.2 Patch Embedding 2.3 位置编码 2.4 Transformer Encoder的前向过程 3 SETR 3.1 图像序列化处理 3.2 Transformer 3.3 解码器 总结 摘要 本周阅读的论文题目是《R…

深度学习入门--python入门1

以前学的python全部还给老师了&#xff0c;所以现在重新开始学习了。目标是每天至少学习一点点吧。 目录 1.1 python是什么 1.2 python安装 1.3 python解释器 1.3.1 算术计算 1.3.2 数据类型 1.3.3 变量 1.3.4 列表&#xff08;数组&#xff09; 1.3.5 字典 1.3.6 布…

【2024最新Java面试宝典】—— SpringBoot面试题(44道含答案)_java spingboot 面试题

37. 如何重新加载 Spring Boot 上的更改&#xff0c;而无需重新启动服务器&#xff1f;Spring Boot项目如何热部署&#xff1f;38. SpringBoot微服务中如何实现 session 共享 ?39. 您使用了哪些 starter maven 依赖项&#xff1f;40. Spring Boot 中的 starter 到底是什么 ?4…

【动态规划】风扫枯杨,满地堆黄叶 - 9. 完全背包问题

本篇博客给大家带来的是完全背包问题之动态规划解法技巧. &#x1f40e;文章专栏: 动态规划 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&#x1f680; 要开心要快乐顺…

python-leetcode-单词搜索

79. 单词搜索 - 力扣&#xff08;LeetCode&#xff09; class Solution:def exist(self, board: List[List[str]], word: str) -> bool:if not board or not board[0]:return Falserows, cols len(board), len(board[0])def backtrack(r, c, index):if index len(word):re…

游戏引擎学习第98天

仓库:https://gitee.com/mrxiao_com/2d_game_2 开始进行一点回顾 今天的目标是继续实现正常贴图的操作&#xff0c;尽管目前我们还没有足够的光照信息来使其完全有用。昨日完成了正常贴图相关的基础工作&#xff0c;接下来将集中精力实现正常贴图的基本操作&#xff0c;并准备…

PH热榜 | 2025-02-10

1. 2pr 标语&#xff1a;人工智能帮你把想法变成LinkedIn爆款 或者更口语化一点&#xff1a; AI帮你把点子变成LinkedIn上的热门帖子 介绍&#xff1a;用AI主持的访谈&#xff0c;把你的想法变成LinkedIn爆款帖子。录制你的想法&#xff0c;让AI帮你创作个性化、引人入胜的…

django配置跨域

1、第一种 from django.views.decorators.csrf import csrf_exemptcsrf_exempt第二种 安装 pip install django-cors-headers在配置文件settings.py进入 INSTALLED_APPS [..."corsheaders", # 添加 ]MIDDLEWARE [corsheaders.middleware.CorsMiddleware, # 添加…

使用C语言实现MySQL数据库的增删改查操作指南

使用C语言与MySQL数据库进行交互,通常涉及使用MySQL提供的C API库。这套API允许开发者在C/C++程序中执行SQL查询,从而实现数据库的增删改查操作。下面,我将详细介绍如何在C语言中实现这些基本操作。 准备工作 安装MySQL开发库:确保你的系统上安装了MySQL服务器以及MySQL开发…

25考研电子信息复试面试常见核心问题真题汇总,电子信息考研复试没有项目怎么办?电子信息考研复试到底该如何准备?

你是不是在为电子信息考研复试焦虑&#xff1f;害怕被老师问到刁钻问题、担心专业面答不上来&#xff1f;别慌&#xff01;作为复试面试92分逆袭上岸的学姐&#xff0c;今天手把手教你拆解电子信息类复试通关密码&#xff01;看完这篇&#xff0c;让你面试现场直接开大&#xf…