Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Intersection de deux 'vector'

1 réponse
Avatar
kangs
Bonjour,

Je dois stocker les =E9l=E9ments communs =E0 2 vector.
J'ai trouv=E9 une solution mais qui ne r=E9pond pas vraiment =E0 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 =E9l=E9ments communs aux deux vectors par
rapport =E0
Data::id.
Sauf que je souhaiterais que dans inter soit stock=E9 les lignes de
rows0 et rows1.
J'imagine qu'il suffit que j'=E9crive mom propre back_inserter, mais
voil=E0 je
ne trouve pas d'exemple ou d'info sur le sujet.

Questions
Est il possible d'=E9crire sont propre back_inserter pour obtenir ce que
je veux ?
Ou mieux est qu'il existe d=E9j=E0 un algo plus adapt=E9 =E0 mon besoin ?

Merci.

1 réponse

Avatar
James Kanze
On May 31, 11:09 pm, kangs wrote:

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