rust / intermediate
Snippet
Effiziente Queue-Operationen mit VecDeque
VecDeque (Doppel-Ende-Queue) bietet O(1) Operationen zum Hinzufugen und Entfernen von beiden Enden, was es ideal fur Queue- und Breitensuchen-Implementierungen macht. Anders als bei Vec, wo push_front O(n) ist, unterstützt VecDeque effiziente Prepend-Operationen. Die push_back-Methode fugt hinten hinzu, push_front fugt vorne hinzu, und pop_front/pop_back entfernen von den jeweiligen Enden. Diese Datenstruktur ist perfekt fur Task-Queues, Task-Planung oder jedes Szenario, in dem Sie FIFO (First-In-First-Out) Verhalten mit gelegentlichen Priority-Einfugungen vorne benötigen.
snippet.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
use std::collections::VecDeque;#[derive(Debug, Clone, PartialEq)]struct Task {id: u32,description: String,priority: u8,}fn main() {let mut task_queue: VecDeque<Task> = VecDeque::new();task_queue.push_back(Task {id: 1,description: "Design feature".to_string(),priority: 2,});task_queue.push_back(Task {id: 2,description: "Write tests".to_string(),priority: 3,});task_queue.push_front(Task {id: 3,description: "Fix critical bug".to_string(),priority: 1,});println!("Queue order:");for task in &task_queue {println!(" {:?}", task);}if let Some(high_priority) = task_queue.pop_front() {println!("\nProcessing: {:?}", high_priority);}if let Some(back_task) = task_queue.pop_back() {println!("Removed from back: {:?}", back_task);}let remaining: VecDeque<Task> = task_queue.clone();println!("\nRemaining {} tasks", remaining.len());task_queue.clear();println!("Queue cleared, length: {}", task_queue.len());}
Erklärung
1
use std::collections::VecDeque;
Importiere VecDeque aus Collections für effiziente Doppel-Ende-Queue-Operationen
2
#[derive(Debug, Clone, PartialEq)]
Leite benötigte Traits ab für Drucken, Klonen und Vergleichen der Task Struct
3
let mut task_queue: VecDeque<Task> = VecDeque::new();
Erstelle leere VecDeque um Task-Elemente zu halten
4
push_back fugt hinten hinzu
Task 2 wird das hintere Element mit niedrigster Priorität
5
push_front Task { id: 3, ... }
Critical Bug Task vorne eingefugt mit höchster Prioritat (1)
6
for task in &task_queue {
Iteriere in Einfugereihenfolge zeigt Front-zu-Back Anordnung
7
if let Some(high_priority) = task_queue.pop_front() {
Entferne und verarbeite höchste Prioritat-Task von vorne (O(1) Operation)
8
if let Some(back_task) = task_queue.pop_back() {
Entferne niedrigste Prioritat-Task von hinten wenn benötigt
9
let remaining: VecDeque<Task> = task_queue.clone();
Klone verbleibende Tasks um Original vor dem Leeren zu bewahren
10
task_queue.clear();
Entferne alle Tasks aus Queue auf einmal