Title
subrange::advance should be improved
Status
new
Section
[range.subrange.access]
Submitter
Hewill Kang

Created on 2023-11-09.00:00:00 last changed 1 week ago

Messages

Date: 2023-11-18.12:05:51

Proposed resolution:

This wording is relative to N4964.

  1. Modify [range.subrange.access] as indicated:

    constexpr subrange& advance(iter_difference_t<I> n);
    

    -9- Effects: Equivalent to:

    if constexpr (bidirectional_iterator<I>) {
      if (n < 0) {
        ranges::advance(begin_, n);
        if constexpr (StoreSize)
          size_ += to-unsigned-like(-n);
        return *this;
      }
    }
    
    auto d = n - ranges::advance(begin_, n, end_);
    if constexpr (StoreSize) {
      n = std::min(n, static_cast<decltype(n)>(size_));
      ranges::advance(begin_, n);
      size_ -= to-unsigned-like(nd);
    } else {
      ranges::advance(begin_, n, end_);
    }
    return *this;
    
Date: 2023-11-09.00:00:00

subrange::advance always increments begin_ via ranges::advance(begin_, n, end_), which has 𝒪(n) complexity for non-common random-access ranges, which can be improved to 𝒪(1) with the help of the size_ member (if provided).

History
Date User Action Args
2023-11-18 12:05:51adminsetmessages: + msg13861
2023-11-09 00:00:00admincreate