On this page
std::ranges::includes
Defined in header <algorithm> |
||
---|---|---|
Call signature | ||
|
(1) | (since C++20) |
|
(2) | (since C++20) |
true
if the projections of the sorted range [
first2
,
last2
)
is a subsequence of the projections of the sorted range [
first1
,
last1
)
.
r1
and r2
as the source ranges, as if by using ranges::begin(r1)
and ranges::begin(r2)
as first1
and first2
respectively, and ranges::end(r1)
and ranges::end(r2)
as last1
and last2
respectively.
Both ranges must be sorted with the given comparison function comp
. A subsequence need not be contiguous.
The function-like entities described on this page are niebloids, that is:
- Explicit template argument lists cannot be specified when calling any of them.
- None of them are visible to argument-dependent lookup.
- When any of them are found by normal unqualified lookup as the name to the left of the function-call operator, argument-dependent lookup is inhibited.
In practice, they may be implemented as function objects, or with special compiler extensions.
Parameters
first1, last1 | - | the sorted range of elements to examine |
r1 | - | the sorted range of elements to examine |
first2, last2 | - | the sorted range of elements to search for |
r2 | - | the sorted range of elements to search for |
comp | - | comparison function to apply to the projected elements |
proj1 | - | projection to apply to the elements in the first range |
proj2 | - | projection to apply to the elements in the second range |
Return value
true
if [
first2
,
last2
)
is a subsequence of [
first1
,
last1
)
; otherwise false
.
Complexity
At most \(\scriptsize 2 \cdot (N_1+N_2-1)\)2·(N1+N2-1) comparisons, where \(\scriptsize N_1\)N1 is ranges::distance(r1)
and \(\scriptsize N_2\)N2 is ranges::distance(r2)
.
Possible implementation
|
Example
#include <algorithm>
#include <cctype>
#include <initializer_list>
#include <iomanip>
#include <iostream>
#include <locale>
#include <string>
template<class T>
std::ostream& operator<<(std::ostream& os, std::initializer_list<T> const& list)
{
for (os << "{ "; auto const& elem : list)
os << elem << ' ';
return os << "} ";
}
struct true_false : std::numpunct<char>
{
std::string do_truename() const { return "? Yes\n"; }
std::string do_falsename() const { return "? No\n"; }
};
int main()
{
std::cout.imbue(std::locale(std::cout.getloc(), new true_false));
auto ignore_case = [](char a, char b) { return std::tolower(a) < std::tolower(b); };
const auto
a = {'a', 'b', 'c'},
b = {'a', 'c'},
c = {'a', 'a', 'b'},
d = {'g'},
e = {'a', 'c', 'g'},
f = {'A', 'B', 'C'},
z = {'a', 'b', 'c', 'f', 'h', 'x'};
std::cout
<< z << "includes\n" << std::boolalpha
<< a << std::ranges::includes(z.begin(), z.end(), a.begin(), a.end())
<< b << std::ranges::includes(z, b)
<< c << std::ranges::includes(z, c)
<< d << std::ranges::includes(z, d)
<< e << std::ranges::includes(z, e)
<< f << std::ranges::includes(z, f, ignore_case);
}
Output:
{ a b c f h x } includes
{ a b c } ? Yes
{ a c } ? Yes
{ a a b } ? No
{ g } ? No
{ a c g } ? No
{ A B C } ? Yes
See also
(C++20)
|
computes the difference between two sets (niebloid) |
(C++20)
|
searches for a range of elements (niebloid) |
(C++23)(C++23)
|
checks if the range contains the given element or subrange (niebloid) |
returns true if one sequence is a subsequence of another (function template) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/ranges/includes