Aracılığıyla paylaş


subrange class (C++ Standart Kitaplığı)

Başlangıç yineleyicisi ve sentinel tarafından tanımlanan aralık öğelerinin bir kısmının görünümünü sağlar.

Sözdizimi

template<input_or_output_iterator I, sentinel_for<I> S, subrange_kind K>
  requires (K == subrange_kind::sized || !sized_sentinel_for<S, I>)
class subrange : public view_interface<subrange<I, S, K>>

Şablon parametreleri

I
Başlangıç yineleyici türü. Kavram, input_or_output_iterator tüm öğeleri okuyabilen bir yineleyici olmasını sağlar I .

K
Alt düzenleme türü: Boyutlu bir alt düzenleme belirtmek için kullanın subrange_kind::sized . Boyutu vermek için yineleyici ve sentinel çıkarılabiliyorsa kullanın sized_sentinel_for<S, I> . Gereksinimsubrange_kind::sized || !sized_sentinel_for<S, I>, boyutu alt düzenleme nesnesinde yerel olarak depolar ve alt düzenlemeyi bir alan oluşturucuyu sized_range kullanarak (burada belirteceğinizsubrange_kind::sized) veya bir , sentinelve size (burada belirteceğiniz şekilde) alan iteratoroluşturucu aracılığıyla oluşturmanızı sized_sentinel_for<S, I> gerektirir.

S
Uç yineleyici türü. Kavram, sized_sentinel_for bunun için I bir sentinel olarak kullanılabilmesini ve sentinel ile geçerli yineleyici konumu I arasındaki uzaklığı sabit sürede hesaplamanın mümkün olmasını sağlarS.

Özellikleri görüntüleme

Aşağıdaki girdilerin açıklaması için bkz . Sınıf özelliklerini görüntüleme

Characteristic Açıklama
Aralık bağdaştırıcısı views::counted
Temel alınan aralık Herhangi bir aralık
Öğe türü iter_reference_t<I>
Yineleyici kategoriyi görüntüleme S kategorisiyle aynı I
Boyutlu Varsa Ksubrange::sized
- constyinelenebilir Kopyalanabilirse I
Ortak aralık ve S aynı türdeyseI.
Ödünç alınan aralık Yes

Üyeler

Üye işlevleri Açıklama
OluşturucularC++20 oluşturma subrange.
operator PairLikeC++20 bir subrange öğesini çift benzeri bir türe dönüştürün.
advanceC++20 Yineleyiciyi belirtilen bir uzaklıkta taşıyın.
begin İlk öğeye bir yineleyici alın.
emptyC++20 öğesinin subrange boş olup olmadığını test edin.
endC++20 sentinel'i öğesinin sonunda alın subrange.
nextC++20 Bunun subrange bir kopyasını oluşturur, ancak depolanan yineleyici belirtilen uzaklık boyunca ilerletildi.
prevC++20 Bunun subrange bir kopyasını oluşturur, ancak depolanan yineleyici belirtilen uzaklık geri taşınır.
sizeC++20 Öğe sayısını alın.
Devralınan view_interface Açıklama
backC++20 Son öğeyi alın.
dataC++20 İlk öğeye bir işaretçi alın.
frontC++20 İlk öğeyi alın.
operator[]C++20 Öğesini belirtilen konumda alın.
operator boolC++20 öğesinin subrange boş olup olmadığını test edin.

Açıklamalar

bir subrange başlangıç ve bitiş yineleyiciniz olduğunda, ancak bunun yerine tek bir nesne geçirmek istediğinizde, A yararlıdır. Örneğin, bir aralık bağdaştırıcısı çağırmak istediyseniz ancak yineleyicileri başlatıp bitirdiyseniz, bunları sarmak ve aralık bağdaştırıcısına subrange geçirmek için bir subrange kullanabilirsiniz.

Gereksinimler

Üst bilgi: <ranges> (C++20'den beri)

Ad alanı: std::ranges

Derleyici Seçeneği: /std:c++20 veya üzeri gereklidir.

Oluşturucular

oluşturun subrange.

1) subrange() requires default_initializable<I> = default;
2) template <Convertible_to_non_slicing<I> It>
    constexpr subrange(It begin, S end) requires (!Store_size);
3) template <Convertible_to_non_slicing<I> It>
    constexpr subrange(It begin, S end, const Size_type size) requires (K == subrange_kind::sized);
4) template <Not_same_as<subrange> rg>
    requires borrowed_range<rg>
        && Convertible_to_non_slicing<iterator_t<rg>, I>
        && convertible_to<sentinel_t<rg>, S>
    constexpr subrange(rg&& r) requires (!_Store_size || sized_range<rg>);
5) template <borrowed_range rg>
        requires Convertible_to_non_slicing<iterator_t<rg>, I> && convertible_to<sentinel_t<rg>, S>
    constexpr subrange(rg&& r, const _Size_type sizeHint) requires (K == subrange_kind::sized)

Parametreler

begin
Alt aralıktaki ilk öğeye işaret eden yineleyici.

end
Alt dizinin sonuna işaret eden Sentinel. İşaret edilen öğe alt düzende yer almıyor.

sizeHint
Öğelerdeki aralığın boyutu. Bu, üye işlevini iyileştirmek size için kullanılır ve bir yineleyiciden ve türleri modellemeyen sized_sentinel_forsentinel'den boyut subrange oluşturmak istiyorsanız gereklidir.

Şablon parametre türleri hakkında bilgi için bkz . Şablon parametreleri.

Dönüş değeri

Bir subrange örnek.

Açıklamalar

1) Varsayılan olarak depolanan yineleyiciyi ve sentinel'i oluşturur. Boyut ipucu 0 olarak ayarlanır.
2) Yineleyiciyi begin ve end sentinel'i depolanan yineleyiciye ve sentinel'e taşımak için kullanırstd::move().
3) depolanan yineleyiciyi ile std::move(begin)başlatır, ile depolanan sentinel std::move(end)ve ile depolanan boyut ipucu size, birinci ve ikinci bağımsız değişkenler arasındaki mesafeye eşit olmalıdır.
4) Bir aralıktan bir subrange oluşturur.
5) davranış, ise tanımlanmamıştır szHint != ranges::distance(rg).

Aralık counted bağdaştırıcısı bir subrangeoluşturabilir. Bu bağdaştırıcı bir başlangıç yineleyicisi ve bir sayı alır.

Örnek: counted

// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    auto pos5 = std::ranges::find(v, 5);
    auto countedView = std::views::counted(pos5, 5);
    for (auto e : countedView) // outputs 5 6 7 8 9
    {
        std::cout << e << ' ';
    }
    std::cout << '\n';

    // You can pass the range directly if it supports input_or_output_iterator, in which case, the
    // count starts from the first element
    const char chars[] = { 'H','i',' ','t','h','e','r','e' };
    for (char c : std::views::counted(chars, 2))
    {
        std::cout << c; // outputs Hi
    }
}
5 6 7 8 9
Hi

operator PairLike

bir subrange öğesini modelleyen pair-likebir türe dönüştürün.

template<not-same-as<subrange> PairLike>
requires pair-like-convertible-from<PairLike, const I&, const S&>
constexpr operator PairLike() const;

Parametreler

Hiçbiri.

Şablon parametre türleri hakkında bilgi için bkz . Şablon parametreleri.

Dönüş değeri

PairLike Depolanan yineleyici ve sentinel ile doğrudan başlatılan bir değer. Çiftteki son değer sentinel olacaktır.

Aşağıdaki örnekte gösterildiği gibi sentinel öğesinin alt bölümdeki son öğeyi geçmiş olduğunu unutmayın.

Açıklamalar

Bu dönüştürme, bir aralığı belirtmek için (ilk, son) çiftleri kabul eden eski Boost::Ranges kodlarda kullanışlıdır.
Bu dönüştürme, bir alt alanı modelleyen pair_likeveya başka bir pair tuple türe dönüştürmek için kullanışlıdır. Bazı tür örnekleri pair_like şunlardır:

std::array<T, 2>
std::pair<T, U>
std::ranges::subrange<I, S, K>
std::tuple<T, U>

Örnek: operator PairLike()

// requires /std:c++20 or later
#include <iostream>
#include <ranges>
#include <vector>
#include <utility>

int main()
{
    constexpr int a[] = {0, 1, 2, 3, 4, 5};
    std::ranges::subrange rg(a);
    rg.advance(2);
    const std::pair<const int*, const int*> p = rg;
    for (auto e : rg)
    {
        std::cout << e << ' ';
    }

    // because the sentinel points after the last element, subtract one to get the last element
    std::cout << '\n' << *p.first << ':' << *(p.second - 1) << '\n'; // outputs 2:5
 }
2 3 4 5
2:5

advance

Bunun subrange için yineleyiciyi öğelere göre n ayarlayın.

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

Parametreler

n
Yineleyicinin kaç öğe ayarlayabileceğiniz. n pozitif (ileriye doğru) veya çift yönlüyse I negatif (geriye doğru gitme) olabilir.

Açıklamalar

Bu işlev içindeki yineleyicinin subrangegeçerli durumunu değiştirir.

sonuna subrangeilerlerseniz yineleyici, sonunda subrangesentinel olarak ayarlanır.
başlangıcını subrange (negatif nkullanarak) geçerseniz, öğesini yaptığınız subrange aralığın yerinde bir öğesi yoksa geçersiz bir parametre özel durumu alırsınız.

Örnek advance

// requires /std:c++20 or later
#include <iostream>
#include <ranges>
#include <string>
#include <vector>

void print(const std::string &msg, auto &&v)
{
    std::cout << msg << '\n';
    for (auto& x : v)
    {
        std::cout << x << ' ';
    }
    std::cout << '\n';
}

int main()
{
    std::vector v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    print("Original vector: ", v); // outputs 0 1 2 3 4 5 6 7 8 9 10

    // create a subrange 3 4 5 6
    std::ranges::subrange theSubrange{ std::ranges::find(v,3), std::ranges::find(v, 7) };
    print("The subrange: ", theSubrange); // outputs 3 4 5 6

    auto sr = theSubrange.advance(2); // get a subrange 2 positions to the right of the current iterator location
    print("theSubrange.advance(2): ", sr); // outputs 5 6
    print("Note that subrange's iterator moved during advance(): ", sr); // outputs 5 6
    sr = theSubrange.advance(-3); // Moving before the subrange, but onto a valid element in the original range 
    print("theSubrange.advance(-3): ", sr); // outputs 2 3 4 5 6
}
Original vector:
0 1 2 3 4 5 6 7 8 9 10
The subrange:
3 4 5 6
theSubrange.advance(2):
5 6
Note that subrange's iterator moved during advance():
5 6
theSubrange.advance(-3):
2 3 4 5 6

begin

içindeki ilk öğeye subrangebir yineleyici alın.

1) constexpr I begin() const requires copyable<I>;
2) [[nodiscard]] constexpr I begin() requires (!std::copyable<I>);

Parametreler

Hiçbiri.

Dönüş değeri

içindeki ilk öğeye subrangeişaret eden bir yineleyici. Yineleyici kopyalanamıyorsa ile döndürülür std::move(). Yineleyici taşınırsa, depolanan yineleyicinin durumu için Itaşıma oluşturucusunun uygulanmasına bağlıdır.

10, 20 ve 30 öğelerini içeren bir vektör resmi. İlk öğe 10 içerir ve begin() olarak etiketlenir. Son öğe 30 içerir ve 'son öğe' olarak etiketlenmiştir. Son öğeden sonraki bir sanal kutu sentinel'i gösterir ve end() olarak etiketlenmiştir.

empty

öğesinin subrange boş olup olmadığını test edin.

constexpr bool empty() const;

Parametreler

Hiçbiri.

Dönüş değeri

öğesi yoksa subrange döndürürtrue. Aksi takdirde döndürür false.

end

Sentinel'i subrange

[[nodiscard]] constexpr S end() const;

Parametreler

Hiçbiri.

Dönüş değeri

içindeki son öğeyi subrangeizleyen sentinel:

10, 20 ve 30 öğelerini içeren bir vektör resmi. İlk öğe 10 içerir ve begin() olarak etiketlenir. Son öğe 30 içerir ve 'son öğe' olarak etiketlenmiştir. Son öğeden sonraki bir sanal kutu sentinel'i gösterir ve end() olarak etiketlenmiştir.

Sentinel, depolanan sentinel'den kopya oluşturulur.

next

Bunun subrange bir kopyasını oluşturur, ancak depolanan yineleyici belirtilen uzaklık boyunca ilerletildi.

1) [[nodiscard]] constexpr subrange next(iter_difference_t<I> n = 1) const & requires forward_iterator<I>;
2) [[nodiscard]] constexpr subrange next(iter_difference_t<I> n = 1) &&;

Parametreler

n
Yineleyicinin ileriye taşınması gereken öğe. Varsayılan değer 1'tir. Pozitif olmalı.

Dönüş değeri

*n*. öğesindeki başlangıcın bir kopyasını subrange döndürür.

Açıklamalar

'nin aksine advance(), next() özgün subrangeiçinde depolanan yineleyicinin konumunu değiştirmez. Döndürülen subrange , özgün alt dizinin sahip olduğu tüm öğelere sahiptir, ancak yineleyici farklı bir konumdadır.

1) Dönüş değeri aşağıdakiyle aynıdır:

auto tmp = *this;
tmp.advance(n);
return tmp;

2) Dönüş değeri aşağıdakiyle aynıdır:

advance(n);
return std::move(*this);

Örnek: next

// requires /std:c++20 or later
#include <iostream>
#include <ranges>
#include <string>
#include <vector>

void print(const std::string &msg, auto &&v)
{
    std::cout << msg << '\n';
    for (auto& x : v)
    {
        std::cout << x << ' ';
    }
    std::cout << '\n';
}

int main()
{
    std::vector v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    print("Original vector:", v); // 0 1 2 3 4 5 6 7 8 9 10

    // create a subrange from the front of v up to (but not including) the element 7
    std::ranges::subrange theSubrange{ std::ranges::find(v,1), std::ranges::find(v, 7) };
    print("The subrange:", theSubrange); // 1 2 3 4 5 6

    auto forward = theSubrange.advance(3); // get a subrange 3 positions to the right of the current iterator location
    print("theSubrange.advance(3):", forward); // 4 5 6

    // prev()
    auto previous = theSubrange.prev(2); // move back 2
    print("theSubrange.prev(2):", previous); // 2 3 4 5 6    
    print("Note that the subrange's iterator did *not* move during prev():", theSubrange); // 4 5 6
}
Original vector:
0 1 2 3 4 5 6 7 8 9 10
The subrange:
1 2 3 4 5 6
theSubrange.next(3):
4 5 6
Note that the original subrange's iterator did *not* move during next():
1 2 3 4 5 6

prev

Bunun subrangebir kopyasını oluşturur, ancak depolanan yineleyici belirtilen uzaklık geri taşınır.

[[nodiscard]] constexpr subrange prev(std::iter_difference_t<I> n = 1 ) const
    requires std::bidirectional_iterator<I>;

Parametreler

n
Yineleyiciyi geri taşımak için kaç öğe. Varsayılan değer 1'tir. Pozitif olmalı.

Dönüş değeri

Yineleyicinin öğeleri geri n taşıdığı ama öğesinin bir kopyasını subrange döndürür.

Açıklamalar

'nin aksine advance(), prev() özgün subrangeiçinde depolanan yineleyicinin konumunu değiştirmez.
Döndürülen subrange , özgün alt dizinin sahip olduğu tüm öğelere sahiptir, ancak yineleyici yalnızca farklı bir konumdadır. Dönüş değerini şöyle düşünebilirsiniz:

auto tmp = *this;
tmp.advance(-n);
return tmp;

Örnek prev

// requires /std:c++20 or later
#include <iostream>
#include <ranges>
#include <string>
#include <vector>

void print(const std::string &msg, auto &&v)
{
    std::cout << msg << '\n';
    for (auto& x : v)
    {
        std::cout << x << ' ';
    }
    std::cout << '\n';
}

int main()
{
    std::vector v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    print("Original vector:", v); // 0 1 2 3 4 5 6 7 8 9 10

    // create a subrange from the front of v up to (but not including) the element 7
    std::ranges::subrange theSubrange{std::ranges::find(v,1), std::ranges::find(v, 7)};
    print("The subrange: ", theSubrange); // 1 2 3 4 5 6

    auto forward = theSubrange.advance(3); // get a subrange 3 positions to the right of the current iterator location
    print("theSubrange.advance(3):", forward); // 4 5 6

    // prev()
    auto previous = theSubrange.prev(2); // move back 2
    print("theSubrange.prev(2):", previous); // 2 3 4 5 6    
    print("Note that the subrange's iterator did *not* move during prev():", theSubrange); // 4 5 6
}
Original vector:
0 1 2 3 4 5 6 7 8 9 10
The subrange:
1 2 3 4 5 6
theSubrange.advance(3):
4 5 6
theSubrange.prev(2):
2 3 4 5 6
Note that the subrange's iterator did *not* move during prev():
4 5 6

size

içindeki subrangeöğe sayısını alır.

constexpr size() const
    requires (K == ranges::subrange_kind::sized);

Parametreler

Hiçbiri.

Dönüş değeri

içindeki subrangeöğe sayısı.

Boyut depolanmazsa (belirtilen ile K == ranges::subrange_kind::sized oluşturulduğunda ve std::sized_sentinel_for<S, I> sağlanmadığındasubrange) boyut, başlangıç ve bitiş yineleyicileri arasındaki uzaklık olarak döndürülür.

Yineleyicinin begin konumunu değiştirmek, advanceörneğin, bildirilen boyutu değiştirir.

Ayrıca bkz.

<ranges>
counted
Sınıfları görüntüleme