Title
drop_view::begin const may have 𝒪(n) complexity
Status
new
Section
[range.drop.view]
Submitter
Hewill Kang

Created on 2023-11-08.00:00:00 last changed 5 months ago

Messages

Date: 2023-11-18.11:26:51

Proposed resolution:

This wording is relative to N4964.

  1. Modify [range.drop.view] as indicated:

    constexpr auto begin()
      requires (!(simple-view<V> &&
                  random_access_range<const V> && sized_range<const V>));
    constexpr auto begin() const
      requires random_access_range<const V> && sized_range<const V>;
    

    -3- Returns:

    1. (?.?) — If V models random_access_range and sized_range,

      ranges::begin(base_) + (ranges::distance(base_) - range_difference_t<V>(size()))
      
    2. (?.?) — Otherwise, ranges::next(ranges::begin(base_), count_, ranges::end(base_)).

    -4- Remarks: In order to provide the amortized constant-time complexity required by the range concept when Vdrop_view does not models random_access_range and sized_rangeforward_range, this functionthe first overload caches the result within the drop_view for use on subsequent calls.

    [Note 1: Without this, applying a reverse_view over a drop_view would have quadratic iteration complexity. — end note]

    
    constexpr auto begin() const
      requires random_access_range<const V> && sized_range<const V>;
    

    -?- Returns: ranges::begin(base_) + (ranges::distance(base_) - range_difference_t<const V>(size())).

Date: 2023-11-08.00:00:00

drop_view::begin const is specified to return ranges::next(ranges::begin(base_), count_, ranges::end(base_)), which has 𝒪(n) complexity when base_ is a random-access-sized but non-common range (demo):

#include <ranges>

int main() {
  const auto s = std::ranges::subrange(std::views::iota(0uz), size_t(-1));
  const auto r = std::ranges::drop_view(s, s.size() - 1);
  const auto b = r.begin(); // time out
}
History
Date User Action Args
2023-11-18 11:26:51adminsetmessages: + msg13859
2023-11-08 00:00:00admincreate