rust - recorrer - ¿Cómo iterar idiomáticamente una mitad de una matriz y modificar la estructura de la otra?
recorrer stream java (1)
¿Cuál es la forma idiomática de iterar (leer) sobre la primera mitad del vector y cambiar la estructura de la segunda mitad del vector dependiendo de la primera? Esto es muy abstracto, pero algunos algoritmos podrían reducirse a este problema. Quiero escribir este ejemplo simplificado de C ++ en Rust:
for (var i = 0; i < vec.length; i++) {
for (var j = i + 1 ; j < vec.length; j++) {
if (f(vec[i], vec[j])) {
vec.splice(j, 1);
j--;
}
}
}
Una solución idiomática de este problema genérico será la misma para Rust y C, ya que no hay restricciones que permitan la simplificación.
Necesitamos usar índices porque la reasignación del vector invalidará las referencias contenidas por los iteradores. Necesitamos comparar el índice con la longitud actual del vector en cada ciclo porque la longitud podría cambiarse. Por lo tanto, una solución idiomática se verá así:
let mut i = 0;
while i < v.len() {
let mut j = i + 1;
while j < v.len() {
if f(v[i], v[j]) {
v.splice(j, 1);
} else {
j += 1;
}
}
i += 1;
}
Si bien este código cubre el caso general, rara vez es útil. No captura aspectos específicos, que generalmente son inherentes al problema en cuestión. A su vez, el compilador no puede detectar ningún error en tiempo de compilación. No aconsejo escribir algo como esto sin considerar primero otro enfoque.