簡體   English   中英

如何將 Rust 向量內的元素向右移動並將越界元素放在開頭?

[英]How do I shift the elements inside a Rust vector to the right and put the out-of-bounds element at the beginning?

我試圖將向量中的元素向右移動,然后將越界元素放回開頭; 向量的旋轉。

這是在向量 1 步驟中移動第一個元素的偽代碼。 由於向量只有 5 個元素,所以5回到向量的開頭:

let V = vec![1, 2, 3, 4, 5];
A = V.move[0].cycle();
A = [5, 1, 2, 3, 4];

A = V.move[0].cycle(); 這是我的嘗試,但由於如果索引超出范圍,Rust 不會旋轉,因此可能難以實現。

在 Python 中,可以將pop函數與列表一起使用:

>>>m = [1, 2, 3, 4, 5]
>>>m += [m.pop(0)]
>>>m
[2, 3, 4, 5, 1]

使用 for 循環,可以將所有元素移動為[5, 1, 2, 3, 4] 是否有與 Rust 中的pop函數等效的函數? 如果有一個功能可以將元素一起移動,那就更好了。

您正在尋找[T]::rotate_right[T]::rotate_left 示例( 游樂場):

let mut v = vec![1, 2, 3, 4, 5];
v.rotate_right(1);
println!("{:?}", v);

這輸出:

[5, 1, 2, 3, 4]

如果您發現自己rotate_*調用rotate_* ,您應該考慮使用不同的數據結構,因為這些方法是線性時間操作。 例如,請參閱此答案

VecDeque是一個類似於Vec的集合,但針對在任一端添加/刪除元素進行了優化。 就像切片一樣,它具有rotate_{left,right}方法,但這些方法比Vec的( VecDeque O(min(mid, len() - mid))時間與O(len())時間更有效對於Vec ):

use std::collections::VecDeque;

fn main() {
    let mut v = (1..6).collect::<VecDeque<_>>();
    v.rotate_right(1);
    println!("{:?}", v);
}

固定鏈接到操場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM