std::includes
| Definiert in Header <algorithm>
|
||
template< class InputIt1, class InputIt2 >
bool includes( InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2 );
|
(1) | (constexpr seit C++20) |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2 >
bool includes( ExecutionPolicy&& policy,
ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2, ForwardIt2 last2 );
|
(2) | (seit C++17) |
template< class InputIt1, class InputIt2, class Compare >
bool includes( InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2, Compare comp );
|
(3) | (constexpr seit C++20) |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2, class Compare >
bool includes( ExecutionPolicy&& policy,
ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2, ForwardIt2 last2, Compare comp );
|
(4) | (seit C++17) |
Gibt true zurück, wenn der sortierte Bereich [first2, last2) eine Teilsequenz des sortierten Bereichs [first1, last1) ist (eine Teilsequenz muss nicht zusammenhängend sein).
[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 sortiert bezüglich comp ist, ist das Verhalten undefiniert.policy.true ist:
|
|
(bis C++20) |
|
|
(seit C++20) |
Parameter
| first1, last1 | - | das Paar von Iteratoren, das den sortierten Bereich der zu untersuchenden Elemente definiert |
| first2, last2 | - | das Paar von Iteratoren, das den sortierten Bereich der zu suchenden Elemente definiert |
| policy | - | die Ausführungsrichtlinie zur Verwendung |
| comp | - | Vergleichsfunktionsobjekt (d.h. ein Objekt, das die Anforderungen von Compare erfüllt), das true zurückgibt, wenn das erste Argument kleiner als das zweite ist (d.h. es wird vor dem zweiten geordnet). Die Signatur der Vergleichsfunktion sollte wie folgt sein:
Obwohl die Signatur kein |
| Typanforderungen | ||
-InputIt1, InputIt2 muss die Anforderungen von LegacyInputIterator erfüllen.
| ||
-ForwardIt1, ForwardIt2 muss die Anforderungen von LegacyForwardIterator erfüllen.
| ||
-Compare muss die Anforderungen von Compare erfüllen.
| ||
Rückgabewert
true wenn [first2, last2) eine Teilsequenz von [first1, last1) ist; andernfalls false.
Eine leere Sequenz ist eine Teilsequenz jeder Sequenz, daher wird true zurückgegeben, wenn [first2, last2) leer ist.
Komplexität
Gegeben N1 als std::distance(first1, last1) und N2 als std::distance(first2, last2):
operator<(bis C++20)std::less{}(seit C++20).comp.Ausnahmen
Die Überladungen mit einem Vorlagenparameter namens ExecutionPolicy melden Fehler wie folgt:
- Wenn die Ausführung einer Funktion, die als Teil des Algorithmus aufgerufen wird, eine Ausnahme auslöst und
ExecutionPolicyeine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jedes andereExecutionPolicyist das Verhalten implementationsdefiniert. - Wenn der Algorithmus keinen Speicher zuweisen kann, wird std::bad_alloc ausgelöst.
Mögliche Implementierung
| include (1) |
|---|
template<class InputIt1, class InputIt2>
bool includes(InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2)
{
for (; first2 != last2; ++first1)
{
if (first1 == last1 || *first2 < *first1)
return false;
if (!(*first1 < *first2))
++first2;
}
return true;
}
|
| include (3) |
template<class InputIt1, class InputIt2, class Compare>
bool includes(InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2, Compare comp)
{
for (; first2 != last2; ++first1)
{
if (first1 == last1 || comp(*first2, *first1))
return false;
if (!comp(*first1, *first2))
++first2;
}
return true;
}
|
Beispiel
#include <algorithm>
#include <cctype>
#include <iostream>
template<class Os, class Co>
Os& operator<<(Os& os, const Co& v)
{
for (const auto& i : v)
os << i << ' ';
return os << '\t';
}
int main()
{
const auto
v1 = {'a', 'b', 'c', 'f', 'h', 'x'},
v2 = {'a', 'b', 'c'},
v3 = {'a', 'c'},
v4 = {'a', 'a', 'b'},
v5 = {'g'},
v6 = {'a', 'c', 'g'},
v7 = {'A', 'B', 'C'};
auto no_case = [](char a, char b) { return std::tolower(a) < std::tolower(b); };
std::cout
<< v1 << "\nincludes:\n" << std::boolalpha
<< v2 << ": " << std::includes(v1.begin(), v1.end(), v2.begin(), v2.end()) << '\n'
<< v3 << ": " << std::includes(v1.begin(), v1.end(), v3.begin(), v3.end()) << '\n'
<< v4 << ": " << std::includes(v1.begin(), v1.end(), v4.begin(), v4.end()) << '\n'
<< v5 << ": " << std::includes(v1.begin(), v1.end(), v5.begin(), v5.end()) << '\n'
<< v6 << ": " << std::includes(v1.begin(), v1.end(), v6.begin(), v6.end()) << '\n'
<< v7 << ": " << std::includes(v1.begin(), v1.end(), v7.begin(), v7.end(), no_case)
<< " (case-insensitive)\n";
}
Ausgabe:
a b c f h x
includes:
a b c : true
a c : true
a a b : false
g : false
a c g : false
A B C : true (case-insensitive)
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 1205 | C++98 | der Rückgabewert war unklar, wenn [first2, last2) leer ist
|
gibt true in diesem Fall zurück
|
Siehe auch
| berechnet die Differenz zwischen zwei Mengen (Funktionsvorlage & Algorithmusfunktionsobjekt) | |
(C++20) |
|
| durchsucht nach dem ersten Vorkommen eines Bereichs von Elementen (Funktionsvorlage & Algorithmusfunktionsobjekt) | |
(C++20) |
|
(C++20) |
bestimmt, ob eine Sequenz eine Teilsequenz einer anderen ist (Algorithmusfunktionsobjekt) |