Vector
vector<T>
es el único tipo de colección primitivo proporcionado por Move. A vector<T>
es una colección homogénea de T
's que puede crecer o reducirse empujando o sacando valores del "final".
Se puede crear una instancia de A vector<T>
con cualquier tipo T
. Por ejemplo, vector<u64>
, vector<address>
, vector<0x42::MyModule::MyResource>
y vector<vector<u8>>
son todos tipos de vectores válidos.
Literales
vector
Literales generales
Se pueden crear vectores de cualquier tipo con vector
literales.
Sintaxis
Tipo
Descripción
vector[]
vector[]: vector<T>
¿Dónde T
está cualquier tipo único que no sea de referencia?
Un vector vacío
vector[e1, ..., en]
vector[e1, ..., en]: vector<T>
donde e_i: T
st 0 < i <= n
yn > 0
Un vector con n
elementos (de longitud n
)
En estos casos, el tipo de vector
se infiere, ya sea a partir del tipo de elemento o del uso del vector. Si no se puede inferir el tipo, o simplemente para mayor claridad, el tipo se puede especificar explícitamente:
Copiar
Ejemplo de literales vectoriales
Copiar
vector<u8>
literales
Un caso de uso común para los vectores en Move es representar "matrices de bytes", que se representan con vector<u8>
. Estos valores se utilizan a menudo con fines criptográficos, como una clave pública o un resultado hash. Estos valores son tan comunes que se proporciona una sintaxis específica para que los valores sean más legibles, en lugar de tener que usar vector[]
donde cada valor individual u8
se especifica en forma numérica.
Actualmente hay dos tipos de vector<u8>
literales admitidos: cadenas de bytes y cadenas hexadecimales .
Cadenas de bytes
Las cadenas de bytes son cadenas literales entre comillas con el prefijo a b
, por ejemplo b"Hello!\n"
.
Son cadenas codificadas en ASCII que permiten secuencias de escape. Actualmente, las secuencias de escape admitidas son:
Secuencia de escape
Descripción
Nueva línea (o avance de línea)
Retorno de carro
Pestaña
\\
Barra invertida
\0
Nulo
\"
Cita
\xHH
Escape hexadecimal, inserta la secuencia de bytes hexadecimalesHH
Cuerdas hexagonales
Las cadenas hexadecimales son cadenas literales entre comillas con el prefijo a x
, por ejemplo x"48656C6C6F210A"
.
Cada par de bytes, desde 00
hasta FF
, se interpreta como u8
un valor codificado en hexadecimal. Así, cada par de bytes corresponde a una única entrada en el archivo vector<u8>
.
Literales de cadena de ejemplo
Copiar
Operaciones
vector
proporciona varias operaciones a través del std::vector
módulo en la biblioteca estándar Move, como se muestra a continuación. Es posible que se agreguen más operaciones con el tiempo. El documento actualizado vector
se puede encontrar aquí .
Función
Descripción
¿Aborta?
vector::empty<T>(): vector<T>
Crea un vector vacío que pueda almacenar valores de tipo.T
Nunca
vector::is_empty<T>(): bool
Retorna true
si el vector v
no tiene elementos y false
en caso contrario.
Nunca
vector::singleton<T>(t: T): vector<T>
Crea un vector de tamaño 1 que contengat
Nunca
vector::length<T>(v: &vector<T>): u64
Devuelve la longitud del vector.v
Nunca
vector::push_back<T>(v: &mut vector<T>, t: T)
Añadir t
al final dev
Nunca
vector::pop_back<T>(v: &mut vector<T>): T
Eliminar y devolver el último elemento env
si v
esta vacio
vector::borrow<T>(v: &vector<T>, i: u64): &T
Devuelve una referencia inmutable al T
índice ati
Si i
no está dentro de los límites
vector::borrow_mut<T>(v: &mut vector<T>, i: u64): &mut T
Devolver una referencia mutable al T
índice ati
Si i
no está dentro de los límites
vector::destroy_empty<T>(v: vector<T>)
Borrarv
Si v
no esta vacio
vector::append<T>(v1: &mut vector<T>, v2: vector<T>)
Agregue los elementos v2
al final dev1
Nunca
vector::reverse_append<T>(lhs: &mut vector<T>, other: vector<T>)
Empuja todos los elementos del other
vector dentro del lhs
vector, en el orden inverso al que ocurrieron enother
Nunca
vector::contains<T>(v: &vector<T>, e: &T): bool
Devuelve verdadero si e
está en el vector v
. De lo contrario, devuelve falso
Nunca
vector::swap<T>(v: &mut vector<T>, i: u64, j: u64)
Intercambia los elementos en los índices i
ésimo y j
ésimo del vector.v
Si i
o j
está fuera de límites
vector::reverse<T>(v: &mut vector<T>)
Invierte el orden de los elementos en el vector v
en su lugar.
Nunca
vector::reverse_slice<T>(v: &mut vector<T>, l: u64, r: u64)
Invierte el orden de los elementos [l, r) en el vector v
en su lugar
Nunca
vector::index_of<T>(v: &vector<T>, e: &T): (bool, u64)
Devuelve (true, i)
si e
está en el vector v
en el índice i
. De lo contrario, regresa(false, 0)
Nunca
vector::insert<T>(v: &mut vector<T>, i: u64, e: T)
Inserte un nuevo elemento e
en la posición 0 <= i <= longitud, usando O(longitud - i) tiempo
Si i
está fuera de límites
vector::remove<T>(v: &mut vector<T>, i: u64): T
Elimina el i
enésimo elemento del vector v
, desplazando todos los elementos posteriores. Esto es O(n) y preserva el orden de los elementos en el vector.
Si i
está fuera de límites
vector::swap_remove<T>(v: &mut vector<T>, i: u64): T
Intercambie el i
ésimo elemento del vector v
con el último elemento y luego extraiga el elemento. Este es O(1), pero no conserva el orden de los elementos en el vector.
Si i
está fuera de límites
vector::trim<T>(v: &mut vector<T>, new_len: u64): u64
Recorta el vector v
al tamaño más pequeño new_len
y devuelve los elementos desalojados en orden
new_len
es mayor que la longitud dev
vector::trim_reverse<T>(v: &mut vector<T>, new_len: u64): u64
Recorta el vector v
al tamaño más pequeño new_len
y devuelve los elementos desalojados en orden inverso.
new_len
es mayor que la longitud dev
vector::rotate<T>(v: &mut vector<T>, rot: u64): u64
rotar (&mut [1, 2, 3, 4, 5], 2) -> [3, 4, 5, 1, 2] en su lugar, devuelve el punto de división, es decir. 3 en este ejemplo
Nunca
vector::rotate_slice<T>(v: &mut vector<T>, left: u64, rot: u64, right: u64): u64
rotar un sector [izquierda, derecha) con izquierda <= rot <= derecha en su lugar, devuelve el punto de división
Nunca
Ejemplo
Copiar
Destruir y copiar vector
s
vector
sAlgunos comportamientos vector<T>
dependen de las habilidades del tipo de elemento T
. Por ejemplo, los vectores que contienen elementos que no tienen drop
no se pueden descartar implícitamente como v
en el ejemplo anterior; deben destruirse explícitamente con vector::destroy_empty
.
Tenga en cuenta que vector::destroy_empty
abortará en tiempo de ejecución a menos que vec
contenga cero elementos:
Copiar
Pero no se produciría ningún error al eliminar un vector que contiene elementos con drop
:
Copiar
De manera similar, los vectores no se pueden copiar a menos que el tipo de elemento sea copy
. En otras palabras, a vector<T>
tiene copy
si y sólo si T
tiene copy
. Sin embargo, incluso los vectores copiables nunca se copian implícitamente:
Copiar
Las copias de vectores grandes pueden ser costosas, por lo que el compilador requiere explícitos copy
para que sea más fácil ver dónde están sucediendo.
Para obtener más detalles, consulte las secciones sobre habilidades de tipo y genéricos.
Propiedad
Como se mencionó anteriormente, vector
los valores se pueden copiar solo si los elementos se pueden copiar. En ese caso, la copia debe ser explícita mediante un copy
o una desreferencia *
.
Last updated