Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::ranges::starts_with(3)   C++ Standard Libary  std::ranges::starts_with(3)

NAME
       std::ranges::starts_with	- std::ranges::starts_with

Synopsis
	  Defined in header <algorithm>
	  Call signature
	  template< std::input_iterator	I1, std::sentinel_for<I1> S1,

		    std::input_iterator	I2, std::sentinel_for<I2> S2,
		    class Pred = ranges::equal_to,
		    class Proj1	= std::identity, class Proj2 = std::identity >
       (since
	  requires  std::indirectly_comparable<I1,  I2,	 Pred,	Proj1,	Proj2>
       (1) C++23)
	  constexpr bool
	      starts_with( I1 first1, S1 last1,	I2 first2, S2 last2, Pred pred
       =
	  {},

			   Proj1 proj1 = {}, Proj2 proj2 = {} );
	  template< ranges::input_range	R1, ranges::input_range	R2,

		    class Pred = ranges::equal_to,
		    class Proj1	= std::identity, class Proj2 = std::identity >
	  requires	    std::indirectly_comparable<ranges::iterator_t<R1>,
       (since
					      ranges::iterator_t<R2>,
       (2) C++23)
					      Pred, Proj1, Proj2>
	  constexpr bool
	      starts_with( R1&&	r1, R2&& r2, Pred pred = {},

			   Proj1 proj1 = {}, Proj2 proj2 = {} );

	  Checks  whether  the	second	range  matches the prefix of the first
       range.

	  1) Let N1 and	N2 denote the  size  of	 ranges	 [first1,  last1)  and
       [first2,	last2)
	  respectively.	 If  N1	 <  N2,	returns	false. Otherwise, returns true
       only if every
	  element in the range [first2,	last2) is equal	to  the	 corresponding
       element in
	  [first1,  first1  +  N2).  Comparison	is done	by applying the	binary
       predicate pred to
	  elements in two ranges projected by proj1 and	proj2 respectively.
	  2) Same as (1), but uses r1 and r2 as	the source ranges, as if using
	  ranges::begin(r1)   as   first1,   ranges:begin(r2)	 as    first2,
       ranges::end(r1) as last1,
	  and ranges::end(r2) as last2.

	  The  function-like  entities	described  on this page	are niebloids,
       that is:

	    * Explicit template	argument lists cannot be specified when	 call-
       ing 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  in-
       hibited.

	  In  practice,	 they  may be implemented as function objects, or with
       special compiler
	  extensions.

Parameters
	  first1, last1	- the range of elements	to examine
	  r1		- the range of elements	to examine
	  first2, last2	- the range of elements	to be used as the prefix
	  r2		- the range of elements	to be used as the prefix
	  pred		- the binary predicate that compares the projected el-
       ements
	  proj1		- the projection to apply to the elements of the range
       to examine
	  proj2		- the projection to apply to the elements of the range
       to be used as
			  the prefix

Return value
	  true if the second range matches the	prefix	of  the	 first	range,
       false otherwise.

Complexity
	  Linear:  at  most min(N1, N2)	applications of	the predicate and both
       projections.

Possible implementation
	  struct starts_with_fn
	  {
	      template<std::input_iterator I1, std::sentinel_for<I1> S1,
		       std::input_iterator I2, std::sentinel_for<I2> S2,
		       class Pred = ranges::equal_to,
		       class Proj1 = std::identity, class Proj2	 =  std::iden-
       tity>
	      requires std::indirectly_comparable<I1, I2, Pred,	Proj1, Proj2>
	      constexpr	 bool  operator()(I1  first1,  S1 last1, I2 first2, S2
       last2,
					Pred pred =  {},  Proj1	 proj1	=  {},
       Proj2 proj2 = {}) const
	      {
		  return       ranges::mismatch(std::move(first1),	last1,
       std::move(first2), last2,
					  std::move(pred),   std::move(proj1),
       std::move(proj2)
					 ).in2 == last2;
	      }

	      template<ranges::input_range R1, ranges::input_range R2,
		       class Pred = ranges::equal_to,
		       class  Proj1  = std::identity, class Proj2 = std::iden-
       tity>
	      requires std::indirectly_comparable<ranges::iterator_t<R1>,
						  ranges::iterator_t<R2>,
						  Pred,	Proj1, Proj2>
	      constexpr	bool operator()(R1&& r1, R2&& r2,
					Pred pred =  {},  Proj1	 proj1	=  {},
       Proj2 proj2 = {}) const
	      {
		  return (*this)(ranges::begin(r1), ranges::end(r1),
				 ranges::begin(r2), ranges::end(r2),
				 std::move(pred),	     std::move(proj1),
       std::move(proj2));
	      }
	  };

	  inline constexpr starts_with_fn starts_with {};

Notes
		 Feature-test macro	     Value    Std		  Fea-
       ture
	  __cpp_lib_ranges_starts_ends_with	      202106L	       (C++23)
       std::ranges::starts_with,
							    std::ranges::ends_with

Example
       // Run this code

	#include <algorithm>
	#include <iostream>
	#include <ranges>
	#include <string_view>

	int main()
	{
	    using namespace std::literals;

	    constexpr auto ascii_upper = [](char8_t c)
	    {
		return u8'a' <=	c && c <=  u8'z'  ?  static_cast<char8_t>(c  +
       u8'A' - u8'a') :	c;
	    };

	    constexpr auto cmp_ignore_case = [=](char8_t x, char8_t y)
	    {
		return ascii_upper(x) == ascii_upper(y);
	    };

	    static_assert(std::ranges::starts_with("const_cast", "const"sv));
	    static_assert(std::ranges::starts_with("constexpr",	"const"sv));
	    static_assert(!std::ranges::starts_with("volatile",	"const"sv));

	    std::cout << std::boolalpha
		      <<	std::ranges::starts_with(u8"Constantinopolis",
       u8"constant"sv,
						  {},  ascii_upper,  ascii_up-
       per) << ' '
		      <<     std::ranges::starts_with(u8"Istanbul",    u8"con-
       stant"sv,
						  {},  ascii_upper,  ascii_up-
       per) << ' '
		      << std::ranges::starts_with(u8"Metropolis", u8"metro"sv,
						  cmp_ignore_case) << '	'
		      << std::ranges::starts_with(u8"Acropolis", u8"metro"sv,
						  cmp_ignore_case) << '\n';

	    constexpr static auto v = {	1, 3, 5, 7, 9 };
	    constexpr auto odd = [](int	x) { return x %	2; };
	    static_assert(std::ranges::starts_with(v, std::views::iota(1)
						    | std::views::filter(odd)
						    | std::views::take(3)));
	}

Output:
	true false true	false

See also
	  ranges::ends_with checks whether a range ends	with another range
	  (C++23)	    (niebloid)
	  ranges::mismatch  finds the first position where two ranges differ
	  (C++20)	    (niebloid)
	  starts_with	    checks if the string starts	with the given prefix
	  (C++20)	    (public member function of
			    std::basic_string<CharT,Traits,Allocator>)
	  starts_with	     checks  if	 the string view starts	with the given
       prefix
	  (C++20)	       (public	  member    function	of    std::ba-
       sic_string_view<CharT,Traits>)

http://cppreference.com		  2024.06.10	   std::ranges::starts_with(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::ranges::starts_with&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help