capypad
0 Tage Serie
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
rust
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