C ++ std :: transforme le vecteur des paires - premier au nouveau vecteur
Désolé pour un peu question de débutant. Il vecteur et le vecteur de paires
typedef std::vector <int> TItems;
typedef std::vector < std::pair <int, int> > TPairs;
Est-il un moyen de transformer les tous premiers éléments de la paire à l'autre vecteur en une seule étape
int main ()
{
TItems items;
TPairs pairs;
pairs.push_back (std::make_pair(1,3));
pairs.push_back (std::make_pair(5,7));
std::transform( items.begin(), items.end(), items.begin(), comp ( &pairs ) );
return 0;
}
À la conception d'un foncteur?
class comp
{
private:
TPairs *pairs;
public:
comp ( TPairs *pairs_ ) : pairs ( pairs_) { }
unsigned int operator () ( const unsigned int index ) const
{
return (*pairs)[index].second != pairs->end(); //Bad idea
}
};
Peut-être il ya certains plus convivial méthode sans expressions lambda et les boucles. Merci pour votre aide.
source d'informationauteur justik
Vous devez vous connecter pour publier un commentaire.
Je veux vraiment que vous utilisez
std::get
que le foncteur, parce que c'est déjà prévu comme une fonction de la bibliothèque!!Serait-il pas merveilleux si nous pouvions écrire cette ligne!?
... Mais c'est un peu plus terribles que ça. Vous avez besoin de lever l'ambiguïté qui
get
à utiliser:Le problème est,
std::get
est surchargé à prendre 1.pair&
2.const pair&
et 3.pair&&
que les paramètres, de sorte qu'il va travailler pour toute sorte de paire comme entrée. Malheureusement, les surcharges obtenir de la manière de le modèle type de la déduction pourstd::transform
de sorte que notre ligne d'originerendements
Il ne sait pas quel surcharge de
std::get
vous demandez quand déduire le modèle destd::transform
donc vous devez spécifier manuellement. Casting le pointeur de fonction vers la droite type indique au compilateur, "Hey, merci d'utiliser la surcharge oùget
prend unconst&
et renvoie unconst&
!"Mais au moins nous sommes à l'aide de la bibliothèque standard de composants (yay)?
Et en termes de nombre de lignes, c'est pas pire que les autres options:
http://ideone.com/6dfzxz
Tout d'abord, vous devez utiliser un
back_inserter
comme troisième argument detransformer
de sorte que les valeurs transformées sont poussés à l'arrière du vecteur.Deuxièmement, vous avez besoin d'une sorte de foncteur qui prend une paire d'entiers et renvoie à la première. Ceci devrait faire:
Maintenant, pour recoller les morceaux:
Après ce code,
items
contient 1 et 5.voir frerich ou kotlinski de réponse pour le C++03.
C++11 solution avec lambda:
Comment à ce sujet?
Simple à comprendre et à déboguer.
Comment sur l'utilisation de
std::bind
?(Remplacer
std::bind
parboost::bind
pour les non-C++11 code)