当前位置: 首页 > 知识库问答 >
问题:

如何将数据从一个切片写入同一个切片?

逄宁
2023-03-14

我想把一个切片的末尾写到同一个切片的顶部。

let mut foo = [1, 2, 3, 4, 5];

foo[..2].copy_from_slice(&[4..]); // error: multiple references to same data (mut and not)

assert!(foo, [4, 5, 3, 4, 5]);

我见过如何在锈菌阵列的两个可变切片上操作

我希望获得尽可能高的性能(例如,通过使用foo.as\u ptr())。

共有3个答案

方璞
2023-03-14

如果您的类型实现了Copy,并且子片不重叠:

fn main() {
    let mut v = [1, 2, 3, 4, 5, 6];

    {
        let (left, right) = v.split_at_mut(3);
        // Perform further work to ensure slices are the same length, as needed
        left.copy_from_slice(right);
    }

    assert!(v == [4, 5, 6, 4, 5, 6]);
}
杨高翰
2023-03-14

Rust 1.37(2019-08-15)在中添加了库函数slice::copy_,该函数完全满足您的需要:

let mut foo = [1, 2, 3, 4, 5];

foo.copy_within(3 .. 5, 0);  // <-- THIS

assert_eq!(foo, [4, 5, 3, 4, 5]);

蔚琦
2023-03-14

要将数据从切片内的一个区域复制到另一个区域(允许重叠),我们甚至不能使用.split_at_mut()

我会使用。在_mut()处拆分_主要是以其他方式。(是否有任何东西使您认为边界检查不会得到优化?此外,您是否复制了足够的数据,相比之下,这只是一个小影响?)

不管怎样,这就是你如何包装std::ptr::copy(允许重叠的副本,又名memmobile)在一个安全或不安全的函数中。

use std::ptr::copy;
use std::ops::Range;

/// Copy the range `data[from]` onto the index `to` and following
///
/// **Panics** if `from` or `to` is out of bounds
pub fn move_memory<T: Copy>(data: &mut [T], from: Range<usize>, to: usize) {
    assert!(from.start <= from.end);
    assert!(from.end <= data.len());
    assert!(to <= data.len() - (from.end - from.start));
    unsafe {
        move_memory_unchecked(data, from, to);
    }
}

pub unsafe fn move_memory_unchecked<T: Copy>(data: &mut [T], from: Range<usize>, to: usize) {
    debug_assert!(from.start <= from.end);
    debug_assert!(from.end <= data.len());
    debug_assert!(to <= data.len() - (from.end - from.start));
    let ptr = data.as_mut_ptr();
    copy(ptr.offset(from.start as isize),
         ptr.offset(to as isize),
         from.end - from.start)
}

fn main() {
    let mut data = [0, 1, 2, 3, 4, 5, 6, 7];
    move_memory(&mut data, 2..6, 0);
    println!("{:?}", data);
    move_memory(&mut data, 0..3, 5);
    println!("{:?}", data);
}

运动场连接

 类似资料:
  • 问题内容: 我在做下面的运动。 创建一个包含四个元素的切片。 创建一个新切片,并将第三个和第四个元素仅复制到其中。 我已经返回了以下程序 我程序的输出是。但我希望newElements切片为[3 4]- 我的程序出了什么问题。 问题答案: 使用内置的复制功能将元素从一个切片复制到另一个切片。 在操场上跑 您可以使用append创建切片并在单个语句中复制元素,但是代码并不像使用copy那样明显。 在

  • 问题内容: 我有3个级别的MultiIndex的熊猫数据框。我试图根据与两个级别相对应的值列表来提取此数据框的行。 我有这样的事情: 现在,我要获取索引级别为“ b”和“ c”的所有行: 即值的具有或在水平和分别为:。 所以我想在第一级上学习一个,并在第二级和第三级上提取特定的元组。 最初,我认为将多索引对象传递给.loc会拉出我想要的值/级别,但这是行不通的。做这样的事情的最好方法是什么? 问题

  • 本文向大家介绍tensorflow从张量中提取一个切片,包括了tensorflow从张量中提取一个切片的使用技巧和注意事项,需要的朋友参考一下 示例 请参阅文档以获取详细信息。tf.slice(input, begin, size) 参数: input:张量 begin:每个维度的起始位置 input size:的每个维度的元素数input,使用-1包括所有剩余元素 块状切片: 使用负索引,检索第

  • 我知道的一种方法是通过活动。我们可以将数据从一个片段发送到另一个活动,再从一个活动发送到另一个片段。还有其他方法吗?

  • 在FragmentOne.class扩展android.support.v4.app.

  • 问题内容: 提取切片的最后一个元素的Go方法是什么? 上面的解决方案有效,但看起来很尴尬。 问题答案: 仅读取切片的最后一个元素: 要删除它: 参见此页面有关切片技巧