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.