Skip to content

Commit a6aa571

Browse files
committed
feat(content): add basic vector
1 parent e10f0e9 commit a6aa571

File tree

1 file changed

+153
-0
lines changed

1 file changed

+153
-0
lines changed

content/2.basic/29.vector.md

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
---
2+
title: 'Vec'
3+
description: 'Explorando Vec<T> en Rust: La Potente Colección de Vectores'
4+
draft: true
5+
data:
6+
type: 'custom'
7+
topicLevel: 'start'
8+
position:
9+
x: 50
10+
y: 600
11+
# width: 320
12+
externalLinks:
13+
- name: 'Libro Oficial'
14+
english: false
15+
link: 'https://book.rustlang-es.org/ch08-01-vectors'
16+
- name: 'Comprehensive Rust'
17+
english: false
18+
link: 'https://google.github.io/comprehensive-rust/es/std-types/vec.html'
19+
- name: 'Documentacion Oficial'
20+
english: true
21+
link: 'https://doc.rust-lang.org/std/vec/struct.Vec.html'
22+
---
23+
## Vec<T> en Rust: La Potente Colección de Vectores
24+
25+
El tipo `Vec<T>` en Rust es una colección dinámica y flexible que permite almacenar una secuencia de elementos del mismo tipo. `Vec<T>` es una parte fundamental de la programación en Rust, proporcionando una manera eficiente de manejar listas de datos que pueden crecer y reducirse dinámicamente. En este blog post, exploraremos el funcionamiento de `Vec<T>`, cómo se utiliza, su representación en memoria, sus ventajas, y algunos patrones de uso comunes.
26+
27+
### ¿Qué es `Vec<T>`?
28+
29+
`Vec<T>`, abreviatura de "vector", es un tipo de dato dinámico en Rust que permite almacenar una colección ordenada de elementos del mismo tipo. A diferencia de los arrays, que tienen un tamaño fijo, los vectores pueden cambiar de tamaño en tiempo de ejecución, lo que los hace extremadamente útiles para muchas aplicaciones.
30+
31+
### Funcionamiento en Memoria
32+
33+
Un `Vec<T>` en Rust se compone de tres partes principales:
34+
35+
1. **Puntero a los Datos:** Apunta al bloque de memoria en el heap donde se almacenan los elementos del vector.
36+
2. **Capacidad:** Indica cuánta memoria ha sido reservada para el vector, lo que puede ser más que el número de elementos actualmente almacenados.
37+
3. **Longitud:** Representa el número de elementos actualmente almacenados en el vector.
38+
39+
#### Gráfico: Representación en Memoria de un `Vec<T>`
40+
41+
```plaintext
42+
+-----------------+
43+
| Puntero | --> [ 1, 2, 3, 4, 5 ]
44+
+-----------------+
45+
| Capacidad: 10 |
46+
+-----------------+
47+
| Longitud: 5 |
48+
+-----------------+
49+
```
50+
51+
### Creación y Uso de `Vec<T>`
52+
53+
Crear y manipular un `Vec<T>` en Rust es sencillo y directo. Aquí hay algunos ejemplos básicos para ilustrar su uso:
54+
55+
#### Ejemplo 1: Creación y Adición de Elementos
56+
57+
```rust
58+
fn main() {
59+
let mut vec = Vec::new(); // Crear un nuevo vector vacío
60+
vec.push(1); // Añadir elementos al vector
61+
vec.push(2);
62+
vec.push(3);
63+
64+
println!("{:?}", vec); // Output: [1, 2, 3]
65+
}
66+
```
67+
68+
#### Ejemplo 2: Acceso a Elementos
69+
70+
```rust
71+
fn main() {
72+
let vec = vec![1, 2, 3, 4, 5];
73+
let primero = vec[0]; // Acceso directo a un elemento
74+
let ultimo = vec[vec.len() - 1]; // Acceso al último elemento
75+
76+
// Acceder a elementos utilizando métodos seguros
77+
if let Some(primer_numero) = numeros.get(0) {
78+
println!("Primer número: {}", primer_numero);
79+
}
80+
81+
// Modificar un elemento
82+
if let Some(segundo_numero) = numeros.get_mut(1) {
83+
*segundo_numero = 25;
84+
}
85+
86+
println!("Primer elemento: {}", primero); // Output: 1
87+
println!("Último elemento: {}", ultimo); // Output: 5
88+
}
89+
```
90+
91+
#### Ejemplo 3: Iteración sobre un `Vec<T>`
92+
93+
```rust
94+
fn main() {
95+
let vec = vec![10, 20, 30, 40];
96+
for valor in &vec {
97+
println!("{}", valor);
98+
}
99+
}
100+
```
101+
102+
### Ventajas de Usar `Vec<T>`
103+
104+
- **Flexibilidad Dinámica:** Los vectores pueden crecer y reducirse en tamaño dinámicamente, lo que los hace adecuados para situaciones donde la cantidad de datos no es conocida de antemano.
105+
- **Eficiencia de Memoria:** `Vec<T>` gestiona eficientemente la memoria al reservar bloques de memoria y redimensionarlos según sea necesario.
106+
- **Compatibilidad con Iteradores:** Los vectores se integran bien con el sistema de iteradores de Rust, permitiendo un manejo eficiente y seguro de colecciones de datos.
107+
108+
109+
### Métodos Seguros para Acceder a Elementos
110+
111+
En Rust, acceder a elementos utilizando `vector[n]` es inseguro porque puede conducir a errores de tiempo de ejecución si el índice `n` está fuera del rango válido del `Vec`. Es preferible utilizar métodos seguros proporcionados por Rust, como `get()`, `get_mut()`, y otros, que garantizan que no se produzcan desbordamientos de índice.
112+
113+
### Métodos Comunes de `Vec<T>`
114+
115+
- `get(index)`: Devuelve una referencia al elemento en la posición `index`, o `None` si el índice está fuera del rango.
116+
- `get_mut(index)`: Devuelve una referencia mutable al elemento en la posición `index`, o `None` si el índice está fuera del rango.
117+
- `first()`: Devuelve una referencia al primer elemento del `Vec`, o `None` si el `Vec` está vacío.
118+
- `last()`: Devuelve una referencia al último elemento del `Vec`, o `None` si el `Vec` está vacío.
119+
- `push()`: Añade un elemento al final del vector.
120+
- `pop()`: Elimina y devuelve el último elemento del vector.
121+
- `len()`: Devuelve el número de elementos en el vector.
122+
- `is_empty()`: Verifica si el vector está vacío.
123+
- `insert()`: Inserta un elemento en una posición específica.
124+
- `remove()`: Elimina un elemento en una posición específica.
125+
126+
#### Ejemplo: Métodos Comunes
127+
128+
```rust
129+
fn main() {
130+
let mut vec = vec![1, 2, 3];
131+
vec.push(4); // Añadir un elemento
132+
vec.insert(1, 5); // Insertar 5 en la posición 1
133+
vec.remove(2); // Eliminar el elemento en la posición 2 (que es el 2)
134+
135+
println!("{:?}", vec); // Output: [1, 5, 3, 4]
136+
}
137+
```
138+
139+
### Seguridad y Prevención de Errores
140+
141+
El uso de métodos seguros como `get()` y `get_mut()` ayuda a prevenir errores de acceso a memoria no válida que podrían ocurrir en otros lenguajes donde acceder a elementos por índice no está tan controlado. Rust enfatiza la seguridad y la prevención de errores en tiempo de compilación, lo que es fundamental para escribir código robusto y confiable.
142+
143+
### Diferencia con Arrays
144+
145+
Los arrays en Rust tienen un tamaño fijo determinado en tiempo de compilación, mientras que los vectores pueden cambiar de tamaño en tiempo de ejecución. Esto hace que los vectores sean más adecuados para colecciones de datos dinámicos.
146+
147+
### Coste Computacional de `Vec<T>`
148+
149+
Manipular vectores implica ciertas operaciones de gestión de memoria, especialmente cuando se redimensionan. Sin embargo, Rust optimiza estas operaciones para minimizar el coste computacional, reservando bloques de memoria de manera eficiente y evitando realocaciones innecesarias.
150+
151+
### Conclusión
152+
153+
`Vec<T>` es una herramienta esencial en Rust para trabajar con colecciones de datos dinámicas. Su flexibilidad, eficiencia y compatibilidad con el sistema de iteradores de Rust lo hacen adecuado para una amplia gama de aplicaciones. Al comprender cómo funciona `Vec<T>` en memoria, sus ventajas y cómo utilizar sus métodos comunes, los desarrolladores pueden aprovechar al máximo las capacidades de Rust para manejar colecciones de datos de manera efectiva y segura.

0 commit comments

Comments
 (0)