首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Rust中连接两个切片?

如何在Rust中连接两个切片?
EN

Stack Overflow用户
提问于 2016-10-20 20:14:28
回答 3查看 21.5K关注 0票数 21

我想从一个向量中获取x的第一个和最后一个元素,并将它们连接起来。我有以下代码:

代码语言:javascript
复制
fn main() {
    let v = (0u64 .. 10).collect::<Vec<_>>();
    let l = v.len();
    vec![v.iter().take(3), v.iter().skip(l-3)];
}

这给了我一个错误

代码语言:javascript
复制
error[E0308]: mismatched types
 --> <anon>:4:28
  |
4 |     vec![v.iter().take(3), v.iter().skip(l-3)];
  |                            ^^^^^^^^^^^^^^^^^^ expected struct `std::iter::Take`, found struct `std::iter::Skip`
<anon>:4:5: 4:48 note: in this expansion of vec! (defined in <std macros>)
  |
  = note: expected type `std::iter::Take<std::slice::Iter<'_, u64>>`
  = note:    found type `std::iter::Skip<std::slice::Iter<'_, u64>>`

如何获取1, 2, 3, 8, 9, 10vec?我使用的是Rust 1.12。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-20 20:17:34

您应该对take()的结果执行collect()操作,并使用skip()collect()编辑结果对其执行extend()操作

代码语言:javascript
复制
let mut p1 = v.iter().take(3).collect::<Vec<_>>();
let p2 = v.iter().skip(l-3);

p1.extend(p2);

println!("{:?}", p1);

编辑:正如Neikos所说,您甚至不需要收集skip()的结果,因为extend()接受实现IntoIterator的参数( Skip可以这样做,因为它是一个Iterator)。

编辑2:您的数字有点小问题;为了获得1, 2, 3, 8, 9, 10,您应该按如下方式声明v

代码语言:javascript
复制
let v = (1u64 .. 11).collect::<Vec<_>>();

因为Range是左关闭和右打开的。

票数 7
EN

Stack Overflow用户

发布于 2016-10-21 08:20:32

只需在切片上使用.concat()

代码语言:javascript
复制
fn main() {
    let v = (0u64 .. 10).collect::<Vec<_>>();
    let l = v.len();
    let first_and_last = [&v[..3], &v[l - 3..]].concat();
    println!("{:?}", first_and_last);
    // The output is `[0, 1, 2, 7, 8, 9]`
}

这会创建一个新的向量,它可以处理任意数量的切片。

(Playground link)

票数 38
EN

Stack Overflow用户

发布于 2016-10-20 20:41:28

好的,首先,你的初始序列定义是错误的。你说你想要1, 2, 3, 8, 9, 10作为输出,所以它应该看起来像这样:

代码语言:javascript
复制
    let v = (1u64 .. 11).collect::<Vec<_>>();

接下来,你说你想要连接切片,所以让我们实际使用切片:

代码语言:javascript
复制
    let head = &v[..3];
    let tail = &v[l-3..];

在这一点上,这真的取决于你最喜欢哪种方法。您可以将这些切片转换为迭代器,链接,然后收集...

代码语言:javascript
复制
    let v2: Vec<_> = head.iter().chain(tail.iter()).collect();

...or制作了一个vec,并直接用切片扩展它...

代码语言:javascript
复制
    let mut v3 = vec![];
    v3.extend_from_slice(head);
    v3.extend_from_slice(tail);

...or使用更通用的迭代器进行扩展(这将在未来变得与专门化等效,但我不相信它还没有那么有效)……

代码语言:javascript
复制
    let mut v4: Vec<u64> = vec![];
    v4.extend(head);
    v4.extend(tail);

你可以在循环中使用Vec::with_capacitypush,或者做链式迭代器的事情,但是使用extend...但在某些时候我不得不停下来。

完整示例代码:

代码语言:javascript
复制
fn main() {
    let v = (1u64 .. 11).collect::<Vec<_>>();
    let l = v.len();

    let head = &v[..3];
    let tail = &v[l-3..];

    println!("head: {:?}", head);
    println!("tail: {:?}", tail);

    let v2: Vec<_> = head.iter().chain(tail.iter()).collect();
    println!("v2: {:?}", v2);

    let mut v3 = vec![];
    v3.extend_from_slice(head);
    v3.extend_from_slice(tail);
    println!("v3: {:?}", v3);

    // Explicit type to help inference.
    let mut v4: Vec<u64> = vec![];
    v4.extend(head);
    v4.extend(tail);
    println!("v4: {:?}", v4);
}
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40154150

复制
相关文章

相似问题

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