std::set_intersection
| Definiert in Header <algorithm>
|
||
template< class InputIt1, class InputIt2, class OutputIt >
OutputIt set_intersection( InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2,
OutputIt d_first );
|
(1) | (constexpr seit 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) | (seit 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 seit 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) | (seit C++17) |
Erstellt einen sortierten Bereich beginnend bei d_first, der aus den Elementen besteht, die in beiden sortierten Bereichen [first1, last1) und [first2, last2) gefunden werden.
Wenn [first1, last1) m Elemente enthält, die zueinander äquivalent sind, und [first2, last2) n Elemente enthält, die zu ihnen äquivalent sind, werden die ersten std::min(m, n) Elemente aus [first1, last1) in den Ausgabebereich kopiert, wobei die Reihenfolge erhalten bleibt.
[first1, last1) oder [first2, last2) nicht sortiert bezüglich operator<(bis C++20)std::less{}(seit C++20) ist, ist das Verhalten undefiniert.[first1, last1) oder [first2, last2) nicht bezüglich comp sortiert ist, ist das Verhalten undefiniert.policy ausgeführt.true ist:
|
|
(bis C++20) |
|
|
(seit C++20) |
Wenn der Ausgabebereich sich mit [first1, last1) oder [first2, last2) überschneidet, ist das Verhalten undefiniert.
Parameter
| first1, last1 | - | das Iteratorpaar, das den ersten sortierten Bereich der zu untersuchenden Elemente definiert |
| first2, last2 | - | das Iteratorpaar, das den zweiten sortierten Bereich der zu untersuchenden Elemente definiert |
| d_first | - | der Anfang des Ausgabebereichs |
| policy | - | die zu verwendende Ausführungsrichtlinie |
| comp | - |
Vergleichsfunktionsobjekt (d.h. ein Objekt, das die Anforderungen von
Compare
erfüllt), das
true
zurückgibt, wenn das erste Argument
kleiner
als (d.h. vor dem zweiten
sortiert
ist) das zweite.
Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgendem sein: bool cmp ( const Type1 & a, const Type2 & b ) ;
Obwohl die Signatur nicht
const
&
benötigt, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte des Typs (möglicherweise const)
|
| Typanforderungen | ||
-
InputIt1, InputIt2
müssen die Anforderungen von
LegacyInputIterator
erfüllen.
|
||
-
OutputIt
müssen die Anforderungen von
LegacyOutputIterator
erfüllen.
|
||
-
ForwardIt1, ForwardIt2, ForwardIt3
müssen die Anforderungen von
LegacyForwardIterator
erfüllen.
|
||
-
Compare
müssen die Anforderungen von
Compare
erfüllen.
|
||
Rückgabewert
Iterator hinter das Ende des konstruierten Bereichs.
Komplexität
Gegeben N 1 als std:: distance ( first1, last1 ) und N 2 als std:: distance ( first2, last2 ) :
Ausnahmen
Die Überladungen mit einem Template-Parameter namens
ExecutionPolicy
melden Fehler wie folgt:
-
Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Exception wirft und
ExecutionPolicyeiner der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist das Verhalten implementierungsdefiniert. - Wenn der Algorithmus keinen Speicher allozieren kann, wird std::bad_alloc geworfen.
Mögliche Implementierung
| 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 und *first2 sind äquivalent. ++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 und *first2 sind äquivalent. ++first2; } } return d_first; } |
Beispiel
#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'; }
Ausgabe:
5 7 7
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 291 | C++98 | es war nicht spezifiziert, wie äquivalente Elemente in den Eingabebereichen zu behandeln sind | spezifiziert |
Siehe auch
| berechnet die Vereinigung zweier Mengen (Funktionsschablone & Algorithmus-Funktionsobjekt) | |
(C++20) |
|
(C++20) |
berechnet die Schnittmenge zweier Mengen (Algorithmus-Funktionsobjekt) |