Rust:如何更新VecDeque中的元素?存入后修改元素的方案
解决Rust中VecDeque存入元素后无法更新的问题
这个问题我太熟了!你遇到的是Rust里经典的所有权转移问题——当你把str1通过push_back存入VecDeque时,str1的所有权已经完全转移给了队列,原来的变量就变成了无效状态,自然没法再修改它了。
要修改队列里的元素,咱们直接操作队列中的实例就行,给你几个实用的解决办法:
方法1:用get_mut通过索引获取可变引用
如果知道元素在队列中的位置,直接用get_mut拿到它的可变引用就能修改:
use std::collections::VecDeque; fn main() { let mut v = VecDeque::new(); let str1 = String::from("Hello"); v.push_back(str1); let str = String::from(" World"); // 索引0对应第一个存入的元素,用if let处理元素存在的情况(比unwrap更安全) if let Some(element) = v.get_mut(0) { element.push_str(&str); } println!("{:?}", v); // 输出 ["Hello World"] }
方法2:用back_mut直接修改队尾元素
如果你刚把元素push到队尾,用back_mut更省事,不用记索引:
use std::collections::VecDeque; fn main() { let mut v = VecDeque::new(); let str1 = String::from("Hello"); v.push_back(str1); let str = String::from(" World"); // 获取队尾的可变引用 if let Some(last_element) = v.back_mut() { last_element.push_str(&str); } println!("{:?}", v); // 输出 ["Hello World"] }
方法3:弹出元素修改后重新存入(不推荐,效率较低)
如果特殊场景需要把元素拿出来修改再放回去,也可以这么做,但不如前两种方法高效:
use std::collections::VecDeque; fn main() { let mut v = VecDeque::new(); let mut str1 = String::from("Hello"); v.push_back(str1); let str = String::from(" World"); // 弹出队尾元素 if let Some(mut element) = v.pop_back() { element.push_str(&str); v.push_back(element); } println!("{:?}", v); // 输出 ["Hello World"] }
总结一下:优先用前两种方法,直接通过可变引用修改队列内的元素,既符合Rust的所有权规则,又能保证效率。
内容的提问来源于stack exchange,提问作者user4776812
相关产品推荐
相关产品推荐

