Intersection de deux 'vector'

Le
kangs
Bonjour,

Je dois stocker les éléments communs à 2 vector.
J'ai trouvé une solution mais qui ne répond pas vraiment à ce que je
veux

Exemple de code :
struct Data
{
std::string id;
// plusieurs autres variables.
};

std::vector<Data> rows0;
std::vector<Data> rows1;
std::vector<Data> inter;

std::set_intersection( rows0.begin(), rows0.end()
,rows1.begin(), rows1.end()
,back_inserter( inter )
,FunctorCmpId() );


Dans 'inter' j'obtiens les éléments communs aux deux vectors par
rapport à
Data::id.
Sauf que je souhaiterais que dans inter soit stocké les lignes de
rows0 et rows1.
J'imagine qu'il suffit que j'écrive mom propre back_inserter, mais
voilà je
ne trouve pas d'exemple ou d'info sur le sujet.

Questions
Est il possible d'écrire sont propre back_inserter pour obtenir ce que
je veux ?
Ou mieux est qu'il existe déjà un algo plus adapté à mon besoin ?

Merci.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
James Kanze
Le #22197351
On May 31, 11:09 pm, kangs
Je dois stocker les éléments communs à 2 vector. J'ai trouvé
une solution mais qui ne répond pas vraiment à ce que je veux

Exemple de code :
struct Data
{
std::string id;
// plusieurs autres variables.
};

std::vector<Data> rows0;
std::vector<Data> rows1;
std::vector<Data> inter;

std::set_intersection( rows0.begin(), rows0.end()
,rows1.begin(), rows1.end()
,back_inserter( inter )
,FunctorCmpId() );

Dans 'inter' j'obtiens les éléments communs aux deux vectors
par rapport à Data::id.
Sauf que je souhaiterais que dans inter soit stocké les lignes de
rows0 et rows1.



C-à-d les indices dans les vecteurs ? Quelque chose du genre :
std::vector<std::pair<size_t, size_t> > inter;

J'imagine qu'il suffit que j'écrive mom propre back_inserter,
mais voilà je ne trouve pas d'exemple ou d'info sur le sujet.

Questions
Est il possible d'écrire sont propre back_inserter pour
obtenir ce que je veux ?



Je ne crois pas. A la fin, l'algorithm va appeler « *iter= »,
avec un des éléments comparés identiques. Tout au plus, tu as
une référence à l'élément dans un des deux vector d'origine. Et
encore. En théorie, au moins, tu peux avoir une référence à un
temporaire, copie d'un des deux éléments. Tu n'as pas
d'itérateur ni d'indice, et tout au plus, en supposant qu'il n'y
a pas de copie, tu peux déduire une des indices ; en aucun cas
les deux.

Ou mieux est qu'il existe déjà un algo plus adapté à mon
besoin ?



Je ne crois pas. Toute la bibliothèque standard est conçue
autour de l'idée qu'on peut copier à volenté, et que chaque fois
que deux « objets » se comparent égaux, on peut se servir de
l'un ou de l'autre, ou d'une copie de l'un ou de l'autre, à
volenté. Dès que tes objets associent une clé et des données, et
que la comparaison ne prend en compte que la clé, tu sors du
modèle. Il te faudrait pratiquement ton propre boucle :

while ( iter1 != end1 && iter2 != end2 ) {
if ( iter1->id < iter2->id ) {
++ iter1;
} else if ( iter2->id < iter1-id ) {
++ iter2;
} else {
*dest ++ = std::make_pair( iter1 - begin1, iter2 -
begin2 );
++ iter1;
++ iter2;
}
}

--
James Kanze
Publicité
Poster une réponse
Anonyme