Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在数组的开头追加值?_Arrays_Rust - Fatal编程技术网

Arrays 如何在数组的开头追加值?

Arrays 如何在数组的开头追加值?,arrays,rust,Arrays,Rust,是否可以在数组的开头追加一个值?我知道如何连接两个数组,但是如果我有一个数组和一个值(与数组的类型相同),我可以将此元素附加到数组的开头吗?在stable Rust中无法做到这一点;数组不能在运行时添加或删除值;它们的长度在编译时是固定的 您更可能需要一个Vec和 另见: 在nightly Rust中,您可以使用不稳定的功能构建一个全新的数组,该数组稍微大一点,并将所有值移动到: // 1.52.0-nightly (2021-03-07 234781afe33d3f339b00)

是否可以在数组的开头追加一个值?我知道如何连接两个数组,但是如果我有一个数组和一个值(与数组的类型相同),我可以将此元素附加到数组的开头吗?

在stable Rust中无法做到这一点;数组不能在运行时添加或删除值;它们的长度在编译时是固定的

您更可能需要一个
Vec

另见:


在nightly Rust中,您可以使用不稳定的功能构建一个全新的数组,该数组稍微大一点,并将所有值移动到:

// 1.52.0-nightly (2021-03-07 234781afe33d3f339b00)
#![allow(incomplete_features)]
#![feature(const_generics, const_evaluatable_checked)]

use std::{
    array::IntoIter,
    mem::{self, MaybeUninit},
    ptr,
};

fn prepend<T, const N: usize>(a: [T; N], v: T) -> [T; N + 1] {
    // # SAFETY
    //
    // Converting an uninitialized array to an array of
    // uninitialized values is always safe.
    // https://github.com/rust-lang/rust/issues/80908
    let mut xs: [MaybeUninit<T>; N + 1] = unsafe { MaybeUninit::uninit().assume_init() };

    let (head, tail) = xs.split_first_mut().unwrap();
    *head = MaybeUninit::new(v);
    for (x, v) in tail.iter_mut().zip(IntoIter::new(a)) {
        *x = MaybeUninit::new(v)
    }

    // # SAFETY
    //
    // We are effectively transmuting from an array of filled `MaybeUninit<T>` to
    // the array of `T`, but cannot actually use `transmute`:
    // https://github.com/rust-lang/rust/issues/61956
    unsafe {
        let tmp_xs = &mut xs as *mut [MaybeUninit<T>; N + 1] as *mut [T; N + 1];
        mem::forget(xs);
        ptr::read(tmp_xs)
    }
}

fn main() {
    let v = prepend([1, 2, 3], 4);
    assert_eq!([4, 1, 2, 3], v);
}
//1.52.0-每晚(2021-03-07 234781AFE3D3F339B00)
#![允许(不完整的功能)]
#![特征(常量泛型,常量可评估\u选中)]
使用std::{
数组::IntoIter,
mem:{self,maybeuniit},
ptr,
};
fn前置(a[T;N],v:T)->[T;N+1]{
//#安全
//
//将未初始化的数组转换为
//未初始化的值总是安全的。
// https://github.com/rust-lang/rust/issues/80908
让mut xs:[maybeuniit;N+1]=不安全的{maybeuniit::uninit();
let(head,tail)=xs.split_first_mut().unwrap();
*头部=可能未调整::新(v);
对于tail.iter_mut().zip中的(x,v)(IntoIter::new(a)){
*x=maybeuniit::新建(v)
}
//#安全
//
//我们正在有效地从一系列填充的'maybeunit'转变为'maybeuniit'
//“T”的数组,但不能实际使用“transmute”:
// https://github.com/rust-lang/rust/issues/61956
不安全{
设tmp_xs=&mut xs为*mut[maybeuniit;N+1]为*mut[T;N+1];
mem::忘记(xs);
ptr::read(tmp_-xs)
}
}
fn main(){
设v=前置([1,2,3],4);
断言eq!([4,1,2,3],v);
}
另见:


“在开始处追加”=“预结束”;您可能会更幸运地使用该术语进行搜索。是否不可能使用您的前置值创建一个大小为1的数组,而只使用该数组进行concat?@BrandonDyer For array?不是在运行时。您可以创建自己的
Arr
类型来分配
N
元素,然后在每次要添加内容时重新创建另一个大小为
N+1
的类型。。。或者,你可以停止尝试使用<代码> VEC < /C>来管理所有这一切,并且不能做得更好(也许是向量,它被设计成允许通过将元素保持在中间的“填充内存”来前后插入大量元素。在某些情况下,使用这些变量会更好,尽管此时最好使用列表)在我们现在拥有的计算机上。这并不完全正确,您可以将变量设置为一个大一点的数组,并将预先指定的值设置为第一个。@BrandonDyer这不是一个普遍可用的解决方案。数组要求始终填充所有值。另见。你能举一个游乐场的例子来说明你是如何做到的,以确保我们谈论的是同一件事吗?我的假设是基于“我知道如何连接两个数组”。如果这是真的,那么就可以使用我描述的方法。@BrandonDyer我认为不可能在运行时连接两个数组并导致另一个数组处于稳定状态。我指的是编译时分配。当然,第一个数组中的值需要在运行时复制,但数组本身在编译时是完全有效的<代码>让arr1:[T;num];设arr2:[T;num+1]