Eliminar elementos de dos vectores dependiendo de los valores dentro de un vector

Tengo dos vectores enteros de igual longitud. Digamos que quiero eliminar todos los elementos del primer vector que son NAN. Obviamente, utilizo el algoritmo remove_if. Digamos que esto elimina los elementos que estaban en los índices 1,2,5. Luego quiero eliminar los elementos del segundo vector en estos índices.

¿Cuál es la forma más canónica de C ++ de hacer esto?

Esto se puede hacer usando Boost creando un zip_iterator y luego iterando sobre la tuple de iteradores de ambos contenedores en paralelo.

Primero pase un par de zip_iterators a std::remove_if , y std::remove_if que el predicado inspeccione los elementos del primer vector para NaN

 auto result = std::remove_if(boost::make_zip_iterator(boost::make_tuple(v1.begin(), v2.begin())), boost::make_zip_iterator(boost::make_tuple(v1.end(), v2.end())), [](boost::tuple const& elem) { return std::isnan(boost::get<0>(elem)); }); 

Luego usa vector::erase para eliminar los elementos innecesarios.

 v1.erase(boost::get<0>(result.get_iterator_tuple()), v1.end()); v2.erase(boost::get<1>(result.get_iterator_tuple()), v2.end()); 

Demo en vivo


La placa de calderas requerida para crear los rangos de iteradores comprimidos se puede reducir aún más usando boost::combine y la versión de remove_if de remove_if .

 auto result = boost::remove_if(boost::combine(v1, v2), [](boost::tuple const& elem) { return std::isnan(boost::get<0>(elem)); }); 

Demo en vivo

Use un vector> para unir los dos vectores. Luego, realice su eliminación basada en el primer elemento y elimine ambos al mismo tiempo.