'Can std::ranges be used with std::list
I note that many algorithms can be used with ranges allowing the use of members of custom types, rather than needing lambda functions. So, am curious whether std::ranges
can be used efficiently with std::list<>
. I am cognisant that std::list<>
is not the go to data structure for such algorithms, but for other issues, it is the better for my purpose.
Solution 1:[1]
In C++20, different ranges can be subdivided into
input_range
,
forward_range
, bidirectional_range
, random_access_range
, and contiguous_range
base on their iterator types. The more refinement of the range, the more operations it supports and the more efficient its performance.
std::list
is a bidirectional_range
, so any C++20 rangified algorithm that requires a bidirectional_range
and below can be applied to it.
Take ranges::transform
in <algorithm>
as an example
template<ranges::input_range R, std::weakly_incrementable O,
std::copy_constructible F, class Proj = std::identity>
requires /* */
constexpr unary_transform_result<ranges::borrowed_iterator_t<R>, O>
transform(R&& r, O result, F op, Proj proj = {});
which explicitly requires that R
must model input_range
. Since std::list
models a more refined bidirectional_range
, it has all the operations supported by input_range
and will work well with this algorithm.
Again, take the range adaptor ranges::transform_view
in <ranges>
as an example
template<ranges::input_range V, std::copy_constructible F>
requires /* */
class transform_view : public ranges::view_interface<transform_view<V, F>>;
which only requires an input_range
, so it can be used with std::list
. It's worth noting that most range adaptors only require the underlying range to model input_range
(only a few require forward_range
), so std::list
will also work well with them.
As for efficiency, since std::list
only supports forward and backward operations, applying C++20 range utilities to it is less efficient than applying it to a random_access_range
such as std::vector
, but it definitely works.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |