首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Rust向量中的元素向右移动,并将越界元素放在开头?

如何将Rust向量中的元素向右移动,并将越界元素放在开头?
EN

Stack Overflow用户
提问于 2019-12-11 01:35:34
回答 2查看 3.8K关注 0票数 9

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

这是移动向量中第一个元素的伪代码1步。由于向量只有5个元素,因此5返回到向量的开头:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
>>>m = [1, 2, 3, 4, 5]
>>>m += [m.pop(0)]
>>>m
[2, 3, 4, 5, 1]

使用for循环,可以将所有元素转换为[5, 1, 2, 3, 4]。Rust中是否有与pop函数等效的函数?如果有一个将所有元素一起移动的函数,那就更好了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-11 01:53:49

您正在寻找[T]::rotate_right[T]::rotate_left。示例(Playground):

代码语言:javascript
复制
let mut v = vec![1, 2, 3, 4, 5];
v.rotate_right(1);
println!("{:?}", v);

这将输出以下内容:

代码语言:javascript
复制
[5, 1, 2, 3, 4]

如果您发现自己经常调用rotate_*,那么您应该考虑使用不同的数据结构,因为这些方法都是线性时间操作。例如,请参见this answer

票数 18
EN

Stack Overflow用户

发布于 2019-12-11 02:07:11

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

代码语言:javascript
复制
use std::collections::VecDeque;

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

(Permalink to the playground)

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59272670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档