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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::ranges::ends_with -	std::ranges::ends_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 >
	  requires  (std::forward_iterator<I1>	|| std::sized_sentinel_for<S1,
       I1>)
	  &&
       (1) (since
		   (std::forward_iterator<I2>  ||  std::sized_sentinel_for<S2,
       I2>)	 C++23)
	  &&
		   std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
	  constexpr bool
	      ends_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 (ranges::forward_range<R1> || ranges::sized_range<R1>) &&
		   (ranges::forward_range<R2>  ||  ranges::sized_range<R2>) &&
       (since
		   std::indirectly_comparable<ranges::iterator_t<R1>,
       (2) C++23)
					      ranges::iterator_t<R2>,
					      Pred, Proj1, Proj2>
	  constexpr bool
	      ends_with( R1&& r1, R2&& r2, Pred	pred = {},

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

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

	  1) Let N1 and	N2 be ranges::distance(first1, last1) and ranges::dis-
       tance(first2,
	  last2)  respectively.	 If N1 < N2, returns false. Otherwise, returns
       true if only if
	  every	element	in the range [first2, last2) is	equal  to  the	corre-
       sponding	element	in
	  [first1 + N1 - N2, last1). 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 suffix
	  r2		- the range of elements	to be used as the suffix
	  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 suffix

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

Complexity
	  Generally linear: at most min(N1, N2)	applications of	the  predicate
       and both
	  projections.	The  predicate and both	projections are	not applied if
       N1 < N2.

	  If both N1 and N2 can	be calculated in constant time (i.e. both  it-
       erator-sentinel
	  type	pairs  model  sized_sentinel_for,  or  both  range types model
       sized_range) and	N1 <
	  N2, the time complexity is constant.

Possible implementation
	  struct ends_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::forward_iterator<I1>	 ||    std::sized_sen-
       tinel_for<S1, I1>) &&
		       (std::forward_iterator<I2>      ||      std::sized_sen-
       tinel_for<S2, I2>) &&
		       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
	      {
		  const	auto n1	= ranges::distance(first1, last1);
		  const	auto n2	= ranges::distance(first2, last2);
		  if (n1 < n2)
		      return false;
		  ranges::advance(first1, n1 - n2);
		  return ranges::equal(std::move(first1), std::move(last1),
				       std::move(first2), std::move(last2),
				       std::move(pred),	     std::move(proj1),
       std::move(proj2));
	      }

	      template<ranges::input_range R1, ranges::input_range R2,
		       class Pred = ranges::equal_to,
		       class Proj1 = std::identity, class Proj2	 =  std::iden-
       tity>
	      requires	(ranges::forward_range<R1> || ranges::sized_range<R1>)
       &&
		       (ranges::forward_range<R2> ||  ranges::sized_range<R2>)
       &&
		       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 ends_with_fn	ends_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 <array>

	static_assert(
	    ! std::ranges::ends_with("for", "cast") &&
	    std::ranges::ends_with("dynamic_cast", "cast") &&
	    ! std::ranges::ends_with("as_const", "cast") &&
	    std::ranges::ends_with("bit_cast", "cast") &&
	    ! std::ranges::ends_with("to_underlying", "cast") &&
	    std::ranges::ends_with(std::array{1,  2,  3, 4}, std::array{3, 4})
       &&
	    ! std::ranges::ends_with(std::array{1, 2, 3, 4}, std::array{4, 5})
	);

	int main() {}

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

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

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

home | help