名前空間
変種
操作

std::ranges::views::drop, std::ranges::drop_view

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
 
ヘッダ <ranges> で定義
template< ranges::view V >

class drop_view

    : public ranges::view_interface<drop_view<V>>
(1) (C++20以降)
namespace views {

    inline constexpr /* unspecified */ drop = /* unspecified */;

}
(2) (C++20以降)
呼び出しシグネチャ
template< ranges::viewable_range R >

    requires /* 以下を参照 */
constexpr ranges::view auto

    drop( R&& r, ranges::range_difference_t<R> count );
(C++20以降)
template< class DifferenceType >
constexpr /* range adaptor closure */ drop( DifferenceType&& count );
(C++20以降)
1) 元のシーケンスの要素から、最初のN個の要素をスキップした範囲アダプター。
2) RangeAdaptorObjectTstd::remove_cvref_t<decltype((e))>Dranges::range_difference_t<decltype((e))> とすると、式 views::drop(e, f)
  • std::span<typename T::element_type>Tstd::span の特殊化である場合。
  • それ以外の場合、T
  • views::repeat(*e.value_, ranges::distance(e) - inc)Tsized_range をモデルとする場合。この場合、e は一度だけ評価されます。
  • ((void)e, auto(f))、それ以外の場合。ただし、ef の評価は未定義の順序となります。
(C++23から)
  • それ以外の場合、drop_view(e, f)
すべての場合において、decltype((f))std::convertible_to<D> をモデルとする必要があります。

drop_view は、基になるビュー V が対応するコンセプトをモデルとする場合、contiguous_rangerandom_access_rangebidirectional_rangeforward_rangeinput_rangecommon_range、および sized_range をモデルとします。

目次

[edit] データメンバー

メンバ 説明
V base_ (private) 基盤となるビュー
(説明用のメンバオブジェクト*)
ranges::range_difference_t<V> count_ (private) スキップする要素数
(説明用のメンバオブジェクト*)
non-propagating-cache<ranges::iterator_t<V>> cache_ (private)
(Vforward_range を満たすが、random_access_range および sized_range を満たさない場合にのみ存在)
begin() の呼び出し結果をキャッシュするオブジェクト
(説明用のメンバオブジェクト*)

[edit] メンバー関数

drop_view を構築します
(public メンバ関数) [編集]
基になる(適応された)ビューのコピーを返す
(public member function) [編集]
先頭へのイテレータを返す
(public メンバ関数) [編集]
終端へのイテレータまたはセンチネルを返す
(public メンバ関数) [編集]
基底(アダプトされた)レンジが sized_range を満たす場合にのみ、要素数を返す
(public メンバ関数) [編集]
std::ranges::view_interface から継承
派生ビューが空かどうかを返す。sized_range または forward_range を満たす場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(C++23)
範囲の先頭への定数イテレータを返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(C++23)
範囲の定数イテレータの番兵を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
イテレータ型が contiguous_iterator を満たす場合にのみ、派生ビューのデータのアドレスを取得する
(std::ranges::view_interface<D> の公開メンバ関数) [編集]
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが bidirectional_rangecommon_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]

[edit] 推論ガイド

[edit] ヘルパーテンプレート

template< class T >

constexpr bool enable_borrowed_range<std::ranges::drop_view<T>> =

    ranges::enable_borrowed_range<T>;
(C++20以降)

ranges::enable_borrowed_range のこの特殊化により、基になるビューがそれを満たす場合、drop_viewborrowed_range を満たします。

[edit]

#include <iostream>
#include <ranges>
 
int main()
{
    const auto nums = {1, 2, 3, 4, 5, 6, 7};
 
    std::cout << "drop " << 2 << ": ";
    for (int i : std::ranges::drop_view{nums, 2})
        std::cout << i << ' ';
    std::cout << '\n';
 
    std::cout << "drop " << 3 << ": ";
    for (int i : nums | std::views::drop(3))
        std::cout << i << ' ';
    std::cout << '\n';
 
    std::cout << "drop " << 4 << ": ";
    for (int i : std::views::iota(1, 8) | std::views::drop(4))
        std::cout << i << ' ';
    std::cout << '\n';
 
    // Note that dropping more than the number of elements is OK:
    for (int dp : {5, 6, 7, 890, 100500})
    {
        std::cout << "drop " << dp << ": ";
        for (int i : std::views::iota(1, 8) | std::views::drop(dp))
            std::cout << i << ' ';
        std::cout << '\n';
    }
}

出力

drop 2: 3 4 5 6 7
drop 3: 4 5 6 7
drop 4: 5 6 7
drop 5: 6 7
drop 6: 7
drop 7:
drop 890: 
drop 100500:

[edit] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3407 C++20 views::drop は、
サイズ付きランダムアクセス範囲を構築できない場合がある。
構築は調整される
常に有効になるように
LWG 3494 C++20 drop_view はこれまで borrowed_range ではありませんでした。 基になるビューがそうであれば、borrowed_range になる

[edit] 関連項目

別のviewの要素から、述語がfalseを返す最初の要素までの先頭部分シーケンスをスキップして構成される view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)