Rust: 如何交换Vec类型中数据的位置?

在脚本语言中,要把Vec<>中两两值进行对调,这个是太过于轻松的事情不过了。但是对于Rust而言,还是有些麻烦。

一、如何对Vec<&str>两两值进行对调?

fn swap(vec: Vec<&str>, i: usize, j: usize) -> Vec<&str> {
    let mut v = vec.clone();
    let len = v.len();
    if len < i + 1 || len < j + 1 {
        panic!("swap: i:{},j:{} is not fit!", i, j);
    }
    if let Some(v_i) = v.get_mut(i) {
        *v_i = &vec[j]; 
    }
    if let Some(v_j) = v.get_mut(j) {
        *v_j = &vec[i];
    }
    println!("before swap vec:{:?}", vec);
    println!("after swap vec:{:?}", v);
    v
}
fn main() {
    println!("swap : {:?}", swap(vec!["ab", "bc", "de"], 1, 2));
}

输出结果:

before swap vec:["ab", "bc", "de"]
after swap vec:["ab", "de", "bc"]

有其它写法,比如简化一些?:

fn swap(vec: Vec<&str>, i: usize, j: usize) -> Vec<&str> {
    let mut v = vec.clone();
    let len = v.len();
    if len < i + 1 || len < j + 1 {
        panic!("swap: i:{},j:{} is not fit!", i, j);
    }
    // (v.get_mut(i), v.get_mut(j))=>部分报错
    if let (Some(v_i), Some(v_j)) = (v.get_mut(i), v.get_mut(j)) {
        *v_i = &(vec.clone())[j]; 
        *v_j = &(vec.clone())[i];
    }
    println!("before swap vec:{:?}", vec);
    println!("after swap vec:{:?}", v);
    v
}

以下的写法可以运行,但结果是不对的,可以看看具体什么原因造成的。clone()?

fn swap(vec: Vec<&str>, i: usize, j: usize) -> Vec<&str> {
    let mut v = vec.clone();
    let len = v.len();
    if len < i + 1 || len < j + 1 {
        panic!("swap: i:{},j:{} is not fit!", i, j);
    }
    if let (Some(v_i), Some(v_j)) = (v.clone().get_mut(i), v.clone().get_mut(j)) {
        *v_i = &vec[j]; //i_val;
        *v_j = &vec[i];
    }
    // if let Some(v_i) = v.get_mut(i) {
    //     *v_i = &vec[j]; //i_val;
    // }
    // if let Some(v_j) = v.get_mut(j) {
    //     *v_j = &vec[i];
    // }

    println!("before swap vec:{:?}", vec);
    println!("after swap vec:{:?}", v);
    v
}

二、标准库中的用法

在Rust中有swap函数,可以直接使用:

let mut v = ["a", "b", "c", "d"];
v.swap(1, 3);
assert!(v == ["a", "d", "c", "b"]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值