如何将 Rust 向内元素向右移动并将越界元素放在开头?

  • 本文关键字:元素 越界 开头 右移 Rust 移动 rust
  • 更新时间 :
  • 英文 :


我试图将向量中的元素向右移动,然后将越界元素放回开头;向量的旋转。

这是用于移动向量 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_*,则应考虑使用不同的数据结构,因为这些方法是线性时间运算。例如,请参阅此答案。

VecDeque是一个类似于Vec的集合,但针对在两端添加/删除元素进行了优化。就像切片一样,它有rotate_{left,right}方法,但这些方法比Vec的(O(min(mid, len() - mid))VecDeque时间(更有效。O(len())时间Vec(:

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

(永久链接到操场(

最新更新