//********************************************************
// The following code example is taken from the book
//  C++23 - The Complete Guide
//  by Nicolai M. Josuttis (www.josuttis.com)
//  https://www.cppstd23.com
//
// The code is licensed under a
//  Creative Commons Attribution 4.0 International License
//  https://creativecommons.org/licenses/by/4.0/
//********************************************************


#include <print>
#include <vector>
#include <algorithm>

int main()
{
  
  std::array coll{8, 42, 7, 42, 15, 7};
 
  // find last element with the value 42 and return a subrange from there to the end:
  auto sub1 = std::ranges::find_last(coll, 42);
  std::println("{} sub with last 42: {}", coll, sub1);

  // find the last value that is a multiple of 3 and return a subrange from there to the end:
  auto times3 = [] (int val) { return val % 3 == 0; };
  auto sub2 = std::ranges::find_last_if(coll, times3);
  std::println("{} sub with last multiple of 3: {}", coll, sub2);

  // find the last even (not odd) value and return a subrange from there to the end:
  auto odd = [] (int val) { return val % 2 == 1; };
  auto sub3 = std::ranges::find_last_if_not(coll, odd);
  std::println("{} sub with last even: {}", coll, sub3);
}

