std::ranges::join_with_view<V,Pattern>::iterator<Const>::operator++,--

来自cppreference.com
 
 
范围库
范围适配器
 
 
constexpr /*iterator*/& operator++();
(1) (C++23 起)
constexpr void operator++( int );
(2) (C++23 起)
constexpr /*iterator*/ operator++( int )

    requires std::is_reference_v</*InnerBase*/> &&
             ranges::forward_range</*Base*/> &&

             ranges::forward_range</*InnerBase*/>;
(3) (C++23 起)
constexpr /*iterator*/& operator--()

    requires std::is_reference_v</*InnerBase*/> &&
             ranges::bidirectional_range</*Base*/> &&
             ranges::bidirectional_range</*InnerBase*/> &&
             ranges::common_range</*InnerBase*/> &&
             ranges::bidirectional_range</*PatternBase*/> &&

             ranges::common_range</*PatternBase*/>;
(4) (C++23 起)
constexpr /*iterator*/ operator--( int )

    requires std::is_reference_v</*InnerBase*/> &&
             ranges::bidirectional_range</*Base*/> &&
             ranges::bidirectional_range</*InnerBase*/> &&
             ranges::common_range</*InnerBase*/> &&
             ranges::bidirectional_range</*PatternBase*/> &&

             ranges::common_range</*PatternBase*/>;
(5) (C++23 起)

进行迭代器的自增或自减。

1)std::visit([](auto& it){ ++it; }, inner_it_ ); 自增内部迭代器
然后按以下方式调整内部和外部迭代器:
  • 如果自增后的内部迭代器是模式范围的尾后迭代器,那么就会将它设为指向下一个内部范围的开头的迭代器。
  • 如果自增后的内部迭代器是某个内部范围的尾后迭代器,那么就会自增外部迭代器。然后:
  • 如果自增后的外部迭代器不是外部范围的尾后迭代器,那么就会将内部迭代器设为指向模式范围的开头的迭代器。
  • 否则,如果 std::is_reference_v<InnerBase >true,那么就会将内部迭代器设为持有奇异值的模式迭代器。
  • 重复以上操作,直到内部迭代器不是尾后迭代器或者外部迭代器是尾后迭代器为止。
2) 等价于 ++*this;
3) 等价于 auto tmp = *this;
++*this;
return tmp;
4) 如果外部迭代器是外部范围的尾后迭代器,那么就会对它进行自减并将内部迭代器设为最后一个内部范围的尾后迭代器,否则什么也不做。
然后按以下方式调整内部和外部迭代器:
  • 如果内部迭代器指向某个内部范围的开头,那么就会将它设为模式范围的尾后迭代器。
  • 如果内部迭代器指向模式范围的开头,那么就会自减外部迭代器并将内部迭代器设为上一个内部范围的尾后迭代器。
  • 重复以上操作,直到内部迭代器不再指向任何范围的开头为止。
最后以 std::visit([](auto& it){ --it; }, inner_it_ ); 自减内部迭代器。
5) 等价于 auto tmp = *this;
--*this;
return tmp;

返回值

1,4) *this
3,5) *this 在修改前的副本。