potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C++20 std::ranges::subrangeのメンバー関数使用例(Microsoft Visual Studio 2019 Community 16.9.0 Preview 3)

Microsoft Visual Studio 2019 Community 16.9.0 Preview 3におけるstd::ranges::subrangeのメンバー関数使用例です。

#include <ranges>
#include <vector>

int main()
{
    std::vector v{ 0, 1, 2, 3, 4 };
    // std::ranges::subrange r{ v };
    std::ranges::subrange r(v.cbegin(), v.cend());

    // イテレーターの取得
    auto begin = r.begin();     // v.cbegin()
    auto end   = r.end();       // v.cend()
    auto pair  = std::tuple(r); // {v.cbegin(), v.cend()}

    // データの取得(std::contiguous_iterator限定)
    auto p = r.data(); // &v[0](厳密にはstd::addressof)

    // 空判定やサイズの取得
    auto empty = r.empty(); // false
    auto size  = r.size();  // 5
    auto f     = (bool)r;   // true

    // 先頭を前後に動かした新しいsubrangeの作成
    auto next      = r.next(3);    // {std::next(v.cbegin(), 3), v.cend()}
    auto next_prev = next.prev(2); // {std::prev(std::next(v.cbegin(), 3), 2), v.cend()}

    // 先頭を前後に動かして参照の返却
    auto adv1 = r.advance(3);  // r = {std::next(v.cbegin(), 3), v.cend()}
    auto adv2 = r.advance(-3); // r = {v.cbegin(), v.cend()}

    // 先頭/末尾/特定位置要素の取得
    auto front = r.front(); // 0
    auto back  = r.back();  // 4
    auto elem3 = r[3];      // 3
}
  • boolstd::tupleへの変換はキャスト演算子オーバーロードを呼び出しています。
  • std::tupleへのキャストはpair likeな型に対するテンプレート関数を呼び出しています。