• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function
    <iterator>

    std::basic_const_iterator::operator<=>

    constexpr auto operator<=>(const basic_const_iterator& y) const
      requires random_access_iterator<Iterator> && three_way_comparable<Iterator>;          // (1)
    
    template<different-from<basic_const_iterator> I>
    constexpr auto operator<=>(const I& y) const
      requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I> &&
               three_way_comparable_with<Iterator, I>;                                      // (2)
    

    概要

    basic_const_iterator<Iterator>オブジェクトと別のイテレータ(basic_const_iterator<Iterator>IteratorIteratorと比較可能なオブジェクト)の三方比較を行う。

    • (1) : basic_const_iterator同士の比較を行う
    • (2) : ラップしているイテレータ(Iterator)と直接比較可能な型との間で比較を行う

    効果

    ラップするイテレータをcurrent_というメンバに保持するとして

    • (1) : 以下と等価

      return current_ <=> y.current_;
      

    • (2) : 以下と等価

      return current_ <=> y;
      

    備考

    (2)の演算子により以下の演算子が使用可能になる(制約は同じものが適用される)。

    // 逆順
    template<different-from<basic_const_iterator> I>
    friend constexpr auto operator<=>(const I&, const basic_const_iterator&);
    

    #include <iostream>
    #include <iterator>
    #include <vector>
    #include <compare>
    
    int main() {
      std::vector vec = {1, 2, 3, 4, 5};
    
      std::basic_const_iterator cit = vec.begin();
      auto se = vec.end();
      std::basic_const_iterator cse = se;
    
    
      std::cout << std::boolalpha;
    
      // (1) basic_const_iterator同士の比較
      std::cout << std::is_lt(cit <=> cse) << '\n';
      std::cout << std::is_lt(cse <=> cit) << '\n';
    
      // (2) 元のイテレータとの比較
      std::cout << std::is_lt(cit <=> se) << '\n';
      std::cout << std::is_lt(se <=> cit) << '\n';
    }
    

    出力

    true
    false
    true
    false
    

    バージョン

    言語

    • C++23

    処理系

    参照