title: Use ranged algorithm on custom container
body: <p>I want to upgrade my custom container to compatible with <code>std::ranges</code> algorithms such as <code>find_if</code> and others, like bellow</p>
  <pre><code>auto is_satisfy = [](CustomContainer::value_type x) { ... };
  std::ranges::find_if(custom_container, is_satisfy);
  // instead of std::find_if(custom_container.begin(), custom_container.end(), is_satisfy);
  </code></pre>
  <p>Signature of <code>std::ranges::find_if</code> like as</p>
  <pre><code>struct find_if_fn {
     template&lt; ranges::input_range R,
              class Proj = std::identity,
              std::indirect_unary_predicate&lt;std::projected&lt;ranges::iterator_t&lt;R&gt;,
                                           Proj&gt;&gt; Pred &gt;
     constexpr ranges::borrowed_iterator_t&lt;R&gt;
     operator()( R&amp;&amp; r, Pred pred = {}, Proj proj = {} ) const
     {
         return (*this)(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj));
     }
  };
  </code></pre>
  <p>What is the <a href="https://en.cppreference.com/w/cpp/ranges/input_range" rel="nofollow noreferrer">input_range concept</a> and how this feature is supported by my own custom container?</p>