Namespaces
Variants

std::set_intersection

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p. ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Ordenamiento y operaciones relacionadas
Operaciones de partición
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo (heap)
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
Definido en el encabezado <algorithm>
template< class InputIt1, class InputIt2, class OutputIt >
OutputIt set_intersection( InputIt1 first1, InputIt1 last1,
                           InputIt2 first2, InputIt2 last2,
                           OutputIt d_first );
(1) (constexpr desde C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2, class ForwardIt3 >
ForwardIt3 set_intersection( ExecutionPolicy&& policy,
                             ForwardIt1 first1, ForwardIt1 last1,
                             ForwardIt2 first2, ForwardIt2 last2,
                             ForwardIt3 d_first );
(2) (desde C++17)
template< class InputIt1, class InputIt2,
          class OutputIt, class Compare >
OutputIt set_intersection( InputIt1 first1, InputIt1 last1,
                           InputIt2 first2, InputIt2 last2,
                           OutputIt d_first, Compare comp );
(3) (constexpr desde C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2,
          class ForwardIt3, class Compare >
ForwardIt3 set_intersection( ExecutionPolicy&& policy,
                             ForwardIt1 first1, ForwardIt1 last1,
                             ForwardIt2 first2, ForwardIt2 last2,
                             ForwardIt3 d_first, Compare comp );
(4) (desde C++17)

Construye un rango ordenado que comienza en d_first que consiste en elementos que se encuentran en ambos rangos ordenados [first1, last1) y [first2, last2).

Si [first1, last1) contiene m elementos que son equivalentes entre sí y [first2, last2) contiene n elementos equivalentes a ellos, los primeros std::min(m, n) elementos se copiarán de [first1, last1) al rango de salida, preservando el orden.

1) Si [first1, last1) o [first2, last2) no está ordenado con respecto a operator<(hasta C++20)std::less{}(desde C++20), el comportamiento no está definido.
3) Si [first1, last1) o [first2, last2) no está ordenado con respecto a comp, el comportamiento no está definido.
2,4) Igual que (1,3), pero ejecutado de acuerdo a policy.
Estas sobrecargas participan en la resolución de sobrecarga solo si el valor de la siguiente expresión es true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(hasta C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(desde C++20)

Si el rango de salida se superpone con [first1, last1) o [first2, last2), el comportamiento no está definido.

Parámetros

first1, last1 - el par de iteradores que define el primer rango ordenado de elementos a examinar
first2, last2 - el par de iteradores que define el segundo rango ordenado de elementos a examinar
d_first - el inicio del rango de salida
policy - la política de ejecución a utilizar
comp - objeto función de comparación (es decir, un objeto que satisface los requisitos de Compare ) que devuelve ​ true si el primer argumento es menor que (es decir, está ordenado antes de) el segundo.

La signatura de la función de comparación debe ser equivalente a lo siguiente:

bool cmp ( const Type1 & a, const Type2 & b ) ;

Aunque la signatura no necesita tener const & , la función no debe modificar los objetos pasados a ella y debe poder aceptar todos los valores de tipo (posiblemente const) Type1 y Type2 independientemente de la categoría de valor (por lo tanto, Type1& no está permitido , ni tampoco Type1 a menos que para Type1 un movimiento sea equivalente a una copia (desde C++11) ).
Los tipos Type1 y Type2 deben ser tales que los objetos de tipos InputIt1 y InputIt2 puedan ser desreferenciados y luego convertidos implícitamente tanto a Type1 como a Type2 . ​

Requisitos de tipo
-
InputIt1, InputIt2 deben cumplir con los requisitos de LegacyInputIterator .
-
OutputIt debe cumplir con los requisitos de LegacyOutputIterator .
-
ForwardIt1, ForwardIt2, ForwardIt3 deben cumplir con los requisitos de LegacyForwardIterator .
-
Compare debe cumplir con los requisitos de Compare .

Valor de retorno

Iterador más allá del final del rango construido.

Complejidad

Dado N 1 como std:: distance ( first1, last1 ) y N 2 como std:: distance ( first2, last2 ) :

1,2) Como máximo 2⋅(N 1 +N 2 )-1 comparaciones usando operator < (until C++20) std:: less { } (since C++20) .
3,4) Como máximo 2⋅(N 1 +N 2 )-1 aplicaciones de la función de comparación comp .

Excepciones

Las sobrecargas con un parámetro de plantilla llamado ExecutionPolicy reportan errores de la siguiente manera:

  • Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y ExecutionPolicy es uno de los standard policies , std::terminate es llamado. Para cualquier otro ExecutionPolicy , el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzado.

Implementación posible

set_intersection (1)
template<class InputIt1, class InputIt2, class OutputIt>
OutputIt set_intersection(InputIt1 first1, InputIt1 last1,
                          InputIt2 first2, InputIt2 last2, OutputIt d_first)
{
    while (first1 != last1 && first2 != last2)
    {
        if (*first1 < *first2)
            ++first1;
        else
        {
            if (!(*first2 < *first1))
                *d_first++ = *first1++; // *first1 y *first2 son equivalentes.
            ++first2;
        }
    }
    return d_first;
}
set_intersection (3)
template<class InputIt1, class InputIt2, class OutputIt, class Compare>
OutputIt set_intersection(InputIt1 first1, InputIt1 last1,
                          InputIt2 first2, InputIt2 last2, OutputIt d_first, Compare comp)
{
    while (first1 != last1 && first2 != last2)
    {
        if (comp(*first1, *first2))
            ++first1;
        else
        {
            if (!comp(*first2, *first1))
                *d_first++ = *first1++; // *first1 y *first2 son equivalentes.
            ++first2;
        }
    }
    return d_first;
}

Ejemplo

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
    std::vector<int> v1{7, 2, 3, 4, 5, 6, 7, 8};
    std::vector<int> v2{5, 7, 9, 7};
    std::sort(v1.begin(), v1.end());
    std::sort(v2.begin(), v2.end());
    std::vector<int> v_intersection;
    std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(),
                          std::back_inserter(v_intersection));
    for (int n : v_intersection)
        std::cout << n << ' ';
    std::cout << '\n';
}

Salida:

5 7 7

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 291 C++98 no estaba especificado cómo manejar elementos equivalentes en los rangos de entrada especificado

Véase también

calcula la unión de dos conjuntos
(plantilla de función & objeto función de algoritmo)
calcula la intersección de dos conjuntos
(objeto función de algoritmo)