2017-04-19 3 views
0

Lorsqu'il y a des éléments communs dans deux tableaux, le std set_union prend-il toujours ces éléments communs du premier tableau? À partir de l'extrait de code ci-dessous, il montre qu'il sélectionne toujours les éléments communs du premier tableau, mais est-ce garanti? Comment faire pour choisir à partir de la seconde.std set_union prend toujours les éléments communs à partir du premier

#include <algorithm> 
#include <vector> 
#include <string> 
#include <iostream> 

struct Foo 
{ 
    Foo(int i, const std::string& n): id(i), name(n){} 
    int id; 
    std::string name; 
}; 

bool comp(const Foo& first, const Foo& second) 
{ 
    return first.id < second.id; 
} 

int main() 
{ 
    Foo foo5A(5, "A"); 
    Foo foo10A(10, "A"); 
    Foo foo15A(15, "A"); 
    Foo foo20A(20, "A"); 
    Foo foo25A(25, "A"); 
    Foo fooA[] = {foo5A, foo10A, foo15A, foo20A, foo25A}; 

    Foo foo10B(10, "B"); 
    Foo foo20B(20, "B"); 
    Foo foo30B(30, "B"); 
    Foo foo40B(40, "B"); 
    Foo foo50B(50, "B"); 
    Foo fooB[] = {foo10B, foo20B, foo30B, foo40B, foo50B}; 

    std::vector<Foo> fooUnion; 
    std::set_union(fooA, fooA+5, fooB, fooB+5, std::back_inserter(fooUnion), comp); 

    for(const auto& f : fooUnion) 
    { 
    std::cout << f.id << ":" << f.name << std::endl;  
    } 
} 

La sortie est la suivante:

5:A 
10:A 
15:A 
20:A 
25:A 
30:B 
40:B 
50:B 
+0

[Cette référence 'std :: set_union'] (http: //en.cppreference .com/w/cpp/algorithm/set_union) devrait être utile. –

Répondre

1

Oui, il le fait, à partir de la référence here:

L'union des deux ensembles est formé par les éléments qui sont présents dans l'un des ensembles, ou dans les deux. Les éléments de la deuxième plage qui ont un élément équivalent dans la première plage ne sont pas copiés dans la plage résultante.

Si vous le souhaitez à choisir la deuxième (Foob), vous échangez les arguments:

std::set_union(fooB, fooB+5, fooA, fooA+5, std::back_inserter(fooUnion), comp);