Namespaces
Variants

std::ranges::set_symmetric_difference, std::ranges::set_symmetric_difference_result

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur intervalles (C++20)
Algorithmes contraints, e.g. ranges::copy, ranges::sort, ...
Opérations de séquence non modifiantes    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modifiantes
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Tri et opérations connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur des intervalles partitionnés)
Opérations d'ensemble (sur des intervalles triés)
Opérations de fusion (sur des intervalles triés)
Opérations de tas
Opérations de minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
Algorithmes contraints
Tous les noms de ce menu appartiennent à l'espace de noms std::ranges
Opérations de séquence non modifiantes
Opérations de séquence modifiantes
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur des intervalles triés)
       
       
Opérations d'ensemble (sur des intervalles triés)
Opérations de tas
Opérations de minimum/maximum
       
       
Opérations de permutation
Opérations de pliage
Opérations sur le stockage non initialisé
Types de retour
 
Défini dans l'en-tête <algorithm>
Signature d'appel
template< std::input_iterator I1, std::sentinel_for<I1> S1,
          std::input_iterator I2, std::sentinel_for<I2> S2,
          std::weakly_incrementable O, class Comp = ranges::less,
          class Proj1 = std::identity, class Proj2 = std::identity >
requires std::mergeable<I1, I2, O, Comp, Proj1, Proj2>
constexpr set_symmetric_difference_result<I1, I2, O>
    set_symmetric_difference( I1 first1, S1 last1, I2 first2, S2 last2,
                              O result, Comp comp = {},
                              Proj1 proj1 = {}, Proj2 proj2 = {} );
(1) (depuis C++20)
template< ranges::input_range R1, ranges::input_range R2,
          std::weakly_incrementable O, class Comp = ranges::less,
          class Proj1 = std::identity, class Proj2 = std::identity >
requires std::mergeable<ranges::iterator_t<R1>, ranges::iterator_t<R2>,
                        O, Comp, Proj1, Proj2>
constexpr set_symmetric_difference_result<ranges::borrowed_iterator_t<R1>, 
                                          ranges::borrowed_iterator_t<R2>, O>
    set_symmetric_difference( R1&& r1, R2&& r2, O result, Comp comp = {},
                              Proj1 proj1 = {}, Proj2 proj2 = {} );
(2) (depuis C++20)
Types d'assistance
template< class I1, class I2, class O >
using set_symmetric_difference_result = ranges::in_in_out_result<I1, I2, O>;
(3) (depuis C++20)

Calcule la différence symétrique de deux intervalles triés : les éléments qui se trouvent dans l'un ou l'autre des intervalles, mais pas dans les deux, sont copiés dans l'intervalle commençant à result. L'intervalle résultant est également trié.

Si un élément est trouvé m fois dans [first1, last1) et n fois dans [first2, last2), il sera copié dans result exactement │m - n│ fois. Si m > n, alors les derniers m - n de ces éléments sont copiés à partir de [first1, last1), sinon les derniers n - m éléments sont copiés à partir de [first2, last2). L'intervalle résultant ne peut pas chevaucher l'un des intervalles d'entrée.

Le comportement est indéfini si

  • les intervalles d'entrée ne sont pas triés par rapport à comp et proj1 ou proj2, respectivement, ou
  • l'intervalle résultant chevauche l'un des intervalles d'entrée.
1) Les éléments sont comparés à l'aide de la fonction de comparaison binaire donnée comp.
2) Identique à (1), mais utilise r1 comme premier intervalle et r2 comme second intervalle, comme si on utilisait ranges::begin(r1) comme first1, ranges::end(r1) comme last1, ranges::begin(r2) comme first2, et ranges::end(r2) comme last2.

Les entités de type fonction décrites sur cette page sont des objets de fonction d'algorithme (informellement appelés niebloids), c'est-à-dire :

Paramètres

first1, last1 - la paire itérateur-sentinelle définissant la première plage triée d'éléments en entrée
first2, last2 - la paire itérateur-sentinelle définissant la deuxième plage triée d'éléments en entrée
r1 - la première plage d'entrée triée
r2 - la deuxième plage d'entrée triée
result - le début de la plage de sortie
comp - comparaison à appliquer aux éléments projetés
proj1 - projection à appliquer aux éléments de la première plage
proj2 - projection à appliquer aux éléments de la deuxième plage

Valeur de retour

{ last1, last2, result_last } , où result_last est la fin de la plage construite.

Complexité

Au plus 2·(N 1 +N 2 )-1 comparaisons et applications de chaque projection, où N 1 et N 2 sont ranges:: distance ( first1, last1 ) et ranges:: distance ( first2, last2 ) , respectivement.

Implémentation possible

struct set_symmetric_difference_fn
{
    template<std::input_iterator I1, std::sentinel_for<I1> S1,
             std::input_iterator I2, std::sentinel_for<I2> S2,
             std::weakly_incrementable O, class Comp = ranges::less,
             class Proj1 = std::identity, class Proj2 = std::identity>
    requires std::mergeable<I1, I2, O, Comp, Proj1, Proj2>
    constexpr ranges::set_symmetric_difference_result<I1, I2, O>
        operator()(I1 first1, S1 last1, I2 first2, S2 last2, O result, Comp comp = {},
                   Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        while (!(first1 == last1 or first2 == last2))
        {
            if (std::invoke(comp, std::invoke(proj1, *first1), std::invoke(proj2, *first2)))
            {
                *result = *first1;
                ++first1;
                ++result;
            }
            else if (std::invoke(comp, std::invoke(proj2, *first2),
                                       std::invoke(proj1, *first1)))
            {
                *result = *first2;
                ++first2;
                ++result;
            }
            else
            {
                ++first1;
                ++first2;
            }
        }
        auto res1 {ranges::copy(std::move(first1), std::move(last1), std::move(result))};
        auto res2 {ranges::copy(std::move(first2), std::move(last2), std::move(res1.out))};
        return {std::move(res1.dans), std::move(res2.dans), std::move(res2.out)};
    }
    template<ranges::input_range R1, ranges::input_range R2,
             std::weakly_incrementable O, class Comp = ranges::less,
             class Proj1 = std::identity, class Proj2 = std::identity>
    requires std::mergeable<ranges::iterator_t<R1>, ranges::iterator_t<R2>,
                            O, Comp, Proj1, Proj2>
    constexpr ranges::set_symmetric_difference_result<
        ranges::borrowed_iterator_t<R1>, ranges::borrowed_iterator_t<R2>, O>
        operator()(R1&& r1, R2&& r2, O result, Comp comp = {},
                   Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        return (*this)(ranges::begin(r1), ranges::end(r1),
                       ranges::begin(r2), ranges::end(r2),
                       std::move(result), std::move(comp),
                       std::move(proj1), std::move(proj2));
    }
};
inline constexpr set_symmetric_difference_fn set_symmetric_difference {};

Exemple

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
void visualize_this(const auto& v, int min = 1, int max = 9)
{
    for (auto i {min}; i <= max; ++ i)
    {
        std::ranges::binary_search(v, i) ? std::cout << i : std::cout << '.';
        std::cout << ' ';
    }
    std::cout << '\n';
}
int main()
{
    const auto in1 = {1, 3, 4,    6, 7, 9};
    const auto in2 = {1,    4, 5, 6,    9};
    std::vector<int> out {};
    std::ranges::set_symmetric_difference(in1, in2, std::back_inserter(out));
    visualize_this(in1);
    visualize_this(in2);
    visualize_this(out);
}

Sortie :

1 . 3 4 . 6 7 . 9
1 . . 4 5 6 . . 9
. . 3 . 5 . 7 . .

Voir aussi

calcule l'union de deux ensembles
(objet fonction d'algorithme)
calcule la différence entre deux ensembles
(objet fonction d'algorithme)
calcule l'intersection de deux ensembles
(objet fonction d'algorithme)
détermine si une séquence est une sous-séquence d'une autre
(objet fonction d'algorithme)
calcule la différence symétrique entre deux ensembles
(modèle de fonction)