vectoriales vectores vecteezy para paginas imagenes illustrator gratis freepik descargar corel vector rust

vectores - ¿Cuál es la forma idiomática de añadir una rebanada a un vector?



vectores gratis illustrator (3)

Tengo un trozo de &[u8] y me gustaría Vec<u8> a un Vec<u8> con una copia mínima. Aquí hay dos enfoques que sé que funcionan:

let s = [0u8, 1u8, 2u8]; let mut v = Vec::new(); v.extend(s.iter().map(|&i| i)); v.extend(s.to_vec().into_iter()); // allocates an extra copy of the slice

¿Hay una mejor manera de hacer esto en Rust estable? ( rustc 1.0.0-beta.2 )


Hay un método que hace exactamente esto: Vec::extend_from_slice

Ejemplo:

let s = [0u8, 1, 2]; let mut v = Vec::new(); v.extend_from_slice(&s);


No puedo hablar de las implicaciones de rendimiento total, pero v + &s funcionará en la versión beta, lo que creo que es similar a empujar cada valor en el Vec original.


v.extend(s.iter().cloned());

Eso es efectivamente equivalente a usar .map(|&i| i) y hace una copia mínima .

El problema es que absolutamente no puedes evitar copiar en este caso. No puede simplemente mover los valores porque una porción no es propietaria de su contenido , por lo tanto, solo puede tomar una copia.

Ahora, dicho esto, hay dos cosas a considerar:

  1. El óxido tiende a ser en línea de manera agresiva; hay suficiente información en este código para que el compilador simplemente copie los valores directamente en el destino sin ningún paso intermedio.

  2. Los cierres en Rust no son como los cierres en la mayoría de los otros idiomas: no requieren una asignación de pila y pueden estar directamente en línea, por lo que no son menos eficientes que codificar directamente el comportamiento.

Tenga en cuenta que los dos anteriores dependen de la optimización: generalmente funcionarán para lo mejor, pero no están garantizados.

Pero habiendo dicho eso ... lo que realmente intentas hacer aquí en este ejemplo específico es agregar una matriz asignada a la pila que posees. No tengo conocimiento de ningún código de biblioteca que realmente pueda aprovechar este hecho (la compatibilidad con los valores de la matriz es bastante débil en Rust en este momento), pero teóricamente, podría crear un equivalente into_iter() utilizando un código inseguro ... pero no lo recomiendo, y probablemente no valga la pena la molestia.