Supprimer des éléments de deux vecteurs en fonction des valeurs contenues dans un vecteur

J’ai deux vecteurs entiers de longueur égale. Disons que je veux supprimer tous les éléments du premier vecteur qui sont NAN. Évidemment, j’utilise l’algorithme remove_if. Disons que cela supprime les éléments qui se trouvaient aux indices 1,2,5. Je veux ensuite supprimer les éléments du second vecteur à ces index.

Quelle est la manière la plus canonique de faire cela en C ++?

Cela peut être fait en utilisant Boost en créant un zip_iterator puis en zip_iterator une itération sur le tuple d’iterators des deux conteneurs en parallèle.

D’abord, passez une paire de zip_iterators à std::remove_if et std::remove_if au prédicat d’inspecter les éléments du premier vector pour 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)); }); 

Ensuite, utilisez vector::erase pour supprimer les éléments inutiles.

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

Démo en direct


Le passe-partout nécessaire pour créer les plages d’iterators compressés peut être encore réduit en utilisant boost::combine et la version 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)); }); 

Démo en direct

Utilisez un vector> pour lier les deux vecteurs. Ensuite, effectuez votre suppression en fonction du premier élément et supprimez les deux en même temps.