Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
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:
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.