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.
Aralık bağdaştırıcıları bir aralıktan bir görünüm (ad alanında Görünüm sınıflarındanstd::views) oluşturur. Görünüm türlerini doğrudan oluşturmak yerine görünüm oluşturmak için bir bağdaştırıcı kullanmanızı öneririz. Bağdaştırıcılar, görünümlere erişmenin amaçlanan yoludur. Bunlar, doğrudan görünüm türlerinin örneklerini oluşturmaktan daha kolay ve bazı durumlarda daha verimlidir.
Görünüm, bir aralıktaki öğelere başvuran basit bir nesnedir. Bir görünüm:
- Bir aralıktan yalnızca belirli öğelerden oluşur.
- Bir aralıktaki öğelerin dönüşümlerini temsil eden.
- Bir aralığın tersi veya yalnızca ilk
nöğeleri olabilir. - Önceki öğelerin bir bileşimi olun.
Görünüm, O(1)kaç öğe olursa olsun kopyalamak, atamak ve yok etmek için ucuzdur. Aşağıdaki örneği inceleyin:
// requires /std:c++20 or later
#include <ranges>
#include <vector>
#include <iostream>
int main()
{
std::vector<int> input = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
auto divisible_by_three = [](const int n) {return n % 3 == 0;};
auto square = [](const int n) {return n * n;};
auto x = input | std::views::filter(divisible_by_three)
| std::views::transform(square);
for (int i : x)
{
std::cout << i << ' ';
}
}
0 9 36 81
İlk aralık bağdaştırıcısı olan filter, öğesinden input üçe bölünebilen öğeleri içeren bir görünüm sağlar. Diğer aralık bağdaştırıcısı olan transform, üçe bölünebilen öğeleri içeren görünümü alır ve bu öğelerin karesinin bir görünümünü sağlar.
Bir aralık bağdaştırıcısı bir görünüm oluşturduğunda, bu görünümü oluşturmak için aralıktaki her öğeyi dönüştürme maliyetine neden olmaz. Görünümdeki bir öğeyi işleme maliyeti yalnızca söz konusu öğeye eriştiğinizde ödenir.
Görünüm oluşturmak, gelecekte iş yapmaya hazırlanmaktır. Önceki örnekte, görünümü oluşturmak üç veya bu öğelerin karesini alarak tüm öğelerin bulunmasına neden olmaz. Çalışma yalnızca görünümdeki bir öğeye eriştiğinizde gerçekleşir.
Görünümün öğeleri genellikle görünümü oluşturmak için kullanılan aralığın gerçek öğeleridir. Görünüm genellikle öğelerin sahibi değildir; yalnızca bunlara başvurur, dışında owning_view. Öğenin değiştirilmesi, görünümün oluşturulduğu aralıktaki öğeyi değiştirir. Aşağıdaki örnekte bu davranış gösterilmektedir:
#include <algorithm>
#include <iostream>
#include <ranges>
int main()
{
int input[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
auto even = [](const int n) { return n % 2 == 0; };
auto x = input | std::views::filter(even); // create a view of the even elements from input
for (int &i : x)
{
std::cout << i << ' '; // 0 2 4 6 8 10
}
std::cout << '\n';
std::ranges::fill(x, 42); // changes the evens from input[] to 42
for (int &i : input) // demonstrates that the even elements in the range are modified
{
std::cout << i << ' '; // // 42 1 42 3 42 5 42 7 42 9 42
}
}
Aralık bağdaştırıcıları birçok biçimde gelir. Örneğin, aşağıdakilere göre bir görünüm oluşturmanıza olanak sağlayan aralık bağdaştırıcıları vardır:
- Bir koşula (
filter) göre başka bir aralığı filtreleme. - Bir aralıktaki
transform() öğeleri dönüştürme. - Aralığı bölme (
split).
Aralık bağdaştırıcıları birbirine zincirlenebilir (birleştirilebilir). Aralıkların gücü ve esnekliği en belirgin olduğu yerdir. Aralık bağdaştırıcıları oluşturma, önceki Standart Şablon Kitaplığı (STL) algoritmalarıyla ilgili temel bir sorunun üstesinden gelmenize olanak tanır. Bu, bunların birlikte zincirlemesinin kolay olmadığından kaynaklanır.
Aşağıdaki aralık bağdaştırıcıları ad alanında std::views kullanılabilir. Ad std::views alanı için std::ranges::viewsbir kolaylık diğer adıdır.
| Aralık bağdaştırıcısı | Açıklama |
|---|---|
all
C++20 |
Bir aralığa ve öğelerine başvuran bir görünüm oluşturun. |
common
C++20 |
Olmayan bir aralıktan aynı yineleyici ve sentinel türlerine sahip bir görünüm oluşturun. |
counted
C++20 |
Belirtilen konumdan başlayarak bir aralığın ilk n öğesinin görünümünü oluşturun. |
drop
C++20 |
Belirtilen sayıda öğeyi önden atlayarak başka bir görünümden görünüm oluşturun. |
drop_while
C++20 |
Belirtilen koşulla eşleşen önde gelen öğeler bırakıldıktan sonra kalan bir aralığın öğelerini içeren bir görünüm oluşturun. |
elements
C++20 |
Bir aralıktaki her tanımlama grubu benzeri değerde seçili dizinin görünümünü oluşturun. |
empty
C++20 |
Öğesi olmayan bir görünüm oluşturun. |
filter
C++20 |
Belirtilen koşulla eşleşen bir aralığın öğelerini içeren bir görünüm oluşturun. |
iota
C++20 |
Artan değerler dizisi içeren bir görünüm oluşturun. |
istream
C++20 |
Akışın öğeleri üzerinde bir görünüm oluşturun. |
join
C++20 |
Birden çok aralığın tüm öğelerini tek bir görünümde birleştiren bir görünüm oluşturun. |
keys
C++20 |
Bir koleksiyondaki her tanımlama grubu benzeri değerde ilk dizinin görünümünü oluşturun. |
lazy_split
C++20 |
Bir görünümü sınırlayıcıya göre alt bölümlere ayırın. |
reverse
C++20 |
Bir aralığın öğelerinin ters sırada bir görünümünü oluşturun. |
single
C++20 |
Bir öğe içeren bir görünüm oluşturun. |
split
C++20 |
Bir görünümü sınırlayıcıya göre alt bölümlere ayırın. |
take
C++20 |
Başka bir görünümden ilk n öğe görünümünü oluşturun. |
take_while
C++20 |
Belirtilen koşulla eşleşen bir aralığın önde gelen öğelerini içeren bir görünüm oluşturun. |
transform
C++20 |
Dönüştürülen öğelerin görünümünü başka bir görünümden oluşturun. |
values
C++20 |
Bir koleksiyondaki her tanımlama grubu benzeri değerde ikinci dizinin görünümünü oluşturun. |
Önceki tabloda, bir aralık bağdaştırıcısı genellikle aralık alma ve görünüm oluşturma olarak tanımlanır. Kesin olarak, aralık bağdaştırıcılarının aşağıdakilerden birini kabul eden bir aralık bağımsız değişkeni vardır:
- türü
cv-unqualifiedmodelleriviewve bağımsız değişkeni bir rvalue veya kopyalanabilir. - Bağımsız değişkeni bir lvalue olarak geçirdiğinizde, görünüm boyunca modellenmeli
rangeve yaşamalıdır. - bağımsız değişkenini çağırırken
owning_viewolduğu gibi bir rvalue olarak geçirdiğinizde verangemodellenmelidirmovable.
Aralık bağdaştırıcı işlevleri genellikle işlev çağrıları gibi görünen ve geçirilebilen türlerde kısıtlamaları zorlayan işlev nesneleridir.
İşlev nesnelerini bekleyen koda aralık bağdaştırıcılarını ve boru işlemlerinin (|) sonucunu geçirebilirsiniz. Aşağıdaki örnekte, aralık bağdaştırıcısının split oluşturduğu görünüm, aralık bağdaştırıcısı bir işlev nesnesi olduğundan bir işlev çağrısı tarafından aralık bağdaştırıcısına transform geçirilirtransform.
std::map<int, string> x = {{0, "Hello, world"}, {42, "Goodbye, world"}};
auto y = x | views::values | views::transform(views::split(' '));
// y is a range whose elements are ranges of whitespace-delimited strings from each value in x:
// {{"Hello", "world"}, {"Goodbye", "world"}}
all
Bir aralıktaki tüm öğelerin görünümünü oluşturun.
template <ranges::viewable_range R>
constexpr ranges::view auto all(R&& rg) const noexcept;
Parametreler
R
Temel alınan aralığın türü.
rg
Görünümün oluşturulacağı aralık.
Dönüş değeri
- Zaten bir görünümse
rg, bir kopyasıdırrg. - Görüntüleme olmayan bir lvalue ise
rg, öğesine başvuranref_viewbirrgdeğeridir. (Görünümünrgömrü,.) -
rgGeçici bir nesne gibi görüntülemeyen bir rvalue ise veya aralığı öğesinestd::movegeçirmenin sonucu ise, birowning_view.
Döndürülen görünümün türünü almak için kullanın std::views::all_t<decltype((rg))> .
Açıklamalar
Bu aralık bağdaştırıcısı, aralığı görünüme dönüştürmenin en iyi yoludur. Aralıktan görünüm oluşturmanın bir nedeni, aralığı değere göre geçirmenin pahalı olması durumunda bunu düşük maliyetle değere geçirmektir.
Görünümler oluşturma, kopyalama ve yok etme açısından uygun maliyetli olduğundan, bir aralığın görünümünü almak, ağır ağırlık aralığını değere göre geçirmenin kullanışlı bir alternatifidir. Olası bir özel durum, owning_viewtemel alınan aralığın sahibi olan bir görünümdür.
Genel olarak, bir görünümü yok etmek için en kötü senaryo, aralıktaki öğe sayısı için karmaşıklığa sahiptir O(N) . Görünüm kopyalarını öğelerle K yok N etseniz bile, toplam karmaşıklık yine de O(N) temel aralığın yalnızca bir kez yok edilmesidir.
Örnek: all
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = {1,2,3,4,5,6,7,8,9,10};
auto myRefView = std::views::all(v); // create a ref_view of the vector
std::cout << myRefView.size() << '\n'; // 10
auto myOwningView = std::views::all(std::move(v)); // create an owning_view from a moved vector
std::cout << myRefView.size() << '\n'; // outputs 0 because myOwningView now owns the elements
std::cout << v.size() << '\n'; // outputs 0 because myOwningView now owns the elements
std::cout << myOwningView.size(); // 10
}
10
0
0
10
common
Aynı başlangıç yineleyicisi ve sentinel türü olmayan bir aralıktan bir görünüm oluşturun.
template <ranges::viewable_range R>
constexpr ranges::view auto common(R&& rg) const noexcept;
Parametreler
R
Temel alınan aralığın türü.
rg
Görünümün oluşturulacağı aralık.
Dönüş değeri
-
views::all(rg)aynı yineleyici ve sentinel türüne sahip bir aralıksarg. -
common_view(views::all(rg))farklı yineleyici ve sentinel türleri varsarg.
Açıklamalar
BIR API, başlangıç yineleyicisinin ve bitiş sentinelinin aynı türe sahip olmasını gerektirdiğinde ve kullandığınız görünüm bu gereksinimi karşılamadığında (veya karşılayıp karşılamadığını bilmiyorsanız), oluşturmak common_viewiçin bu aralık bağdaştırıcısını kullanın. Başlangıç yineleyicisinin türünün ve son sentinel türünün aynı olduğunu garanti eder.
Örnek: common
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <numeric>
#include <list>
int main()
{
std::list<int> lst{1, 2, 3, 4, 5, 6, 7, 8, 9};
auto firstFive = std::views::take(lst, 5);
// firstFive.begin(), firstFive.end() have different types: counted_iterator versus default_sentinel
// auto r = std::accumulate(firstFive.begin(), firstFive.end(), 0); // Error: accumulate() requires firstFive.begin() and firstFive.end() types to be the same.
auto common = std::views::common(firstFive); // create a common_view that has the same begin/end iterator types
std::cout << std::accumulate(common.begin(), common.end(), 0); // Now you can call the API because the iterator types are the same. Outputs 15 (1+2+3+4+5)
}
15
counted
Belirtilen konumdan başlayarak bir aralığın ilk count öğelerinin görünümünü oluşturun.
template<class Iterator>
constexpr auto counted(Iterator&& it, iter_difference_t<Iterator> count);
Parametreler
DifferenceType
Sayının türü.
Iterator
Yineleyicinin türü.
count
Görünüme eklenecek öğe sayısı. Negatif olmamalıdır.
- ise
count == 0, boşspanbir döndürülür. - Aralıktaki öğe sayısından büyükse
count, davranış tanımlanmamıştır.
it
Başlangıç olarak aralıktaki öğeye yönelik bir yineleyici. Yineleyicinin işaret olduğu öğe, oluşturulan görünüme eklenir.
Dönüş değeri
A span , öğelerini bitişik olarak depolayan diziler, vektörler ve diğer kapsayıcılar için ise itcontiguous_iterator döndürülür. Aksi takdirde, bir subrange döndürülür.
Açıklamalar
Eklenen öğeler şunlardır: [it, count).
Görünüm oluşturulduktan sonra, görünümde oluşturulan aralık değişse bile görünümdeki öğelerin sayısı aynı kalır. Ancak, temel alınan aralık değişirse, görünümden öğelere erişmek tanımsız davranışa neden olabilir.
Örnek: counted
// requires /std:c++20 or later
#include <algorithm>
#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
drop
Bir aralığın ilk n öğesini dışlayan bir görünüm oluşturun.
1) template<ranges::viewable_range R>
constexpr ranges::view auto drop(R&& rg, ranges::range_difference_t<R> count);
2) template<class DifferenceType>
constexpr /* range closure object */ drop(DifferenceType&& count);
Parametreler
DifferenceType
Atlana öğe sayısını açıklayan tür.
count
önünden rgbırakıla öğe sayısı. Negatif olmamalıdır.
- ise
count == 0içindeki tüm öğelerrgdöndürülür. - içindeki öğe
countsayısından büyüksergboş bir görünüm döndürülür.
R
Aralığın türü.
rg
Görünümü oluşturmak için kullanılan aralık.
Dönüş değeri
Belirtilen sayıda öğe önden bırakılan temel aralığın görünümü.
Temel alınan aralıkta var olandan daha fazla öğe belirtirseniz, bir empty_view döndürülür.
Döndürülen görünüm genellikle, ancak her zaman değil, bir uzmanlığıdır drop_view. Bunun anlamı:
- , veya
Vuzmanlık alanı ise ,empty_view,spanveyabasic_string_viewher ikisiiota_viewde vesubrangeise, sonuç bir uzmanlığıdırrandom_access_range.sized_rangeV - Aksi takdirde, sonuç bir
drop_viewşeklindedir.
Açıklamalar
Oluşturulduktan sonra, görünümdeki öğelerin sayısı değişiklikten oluşturulan görünümde bile aynı kalır. Ancak, temel alınan görünüm değişirse, döndürülen görünümdeki öğelere erişmek tanımsız davranışa neden olabilir.
drop , öğesinin tersidir take.
Daha önce "2)" olarak gösterilen kod, kanal söz dizimi ile kullanılabilir: collection | drop(5). Ya da işlev çağrısı söz dizimi ile kullanılabilir: drop(collection, 5) veya drop(5)(collection).
Örnek: drop
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v{1, 2, 3, 4, 5};
auto newView = std::views::drop(v, 3);
for (auto e : newView) // 4 5
{
std::cout << e << ' ';
}
std::cout << '\n';
auto numbers = std::views::iota(0) | std::views::take(10); // build a view of 10 integers
auto latterHalf = numbers | std::views::drop(5);
for (auto i : latterHalf)
{
std::cout << i << ' '; // 5 6 7 8 9
}
}
4 5
5 6 7 8 9
drop_while
Belirtilen koşulla eşleşen önde gelen öğeler bırakıldıktan sonra kalan bir aralığın öğelerini içeren bir görünüm oluşturun.
1) template<ranges::viewable_range R, class P>
constexpr ranges::view auto drop_while(R&& rg, P&& predicate);
2) template<class P>
constexpr /*range adaptor closure*/ drop_while(P&& predicate);
Parametreler
R
Aralığın türü.
predicate
Aralıktan hangi önde gelen öğelerin bırakıldığını belirleyen koşullar.
rg
Görünümün oluşturulacağı temel aralık.
Dönüş değeri
drop_while_view Koşulla eşleşen önde gelen öğeler bırakıldığında kalan öğelerden oluşan bir.
Açıklamalar
Koşul döndürdüğü rganda öğesinden false öğeleri bırakır.
drop_while , öğesinin tersidir take_while.
Daha önce "2)" olarak gösterilen kod, kanal söz dizimi ile kullanılabilir: collection | drop_while(predicate). Ya da işlev çağrısı söz dizimi ile kullanılabilir: drop_while(collection, predicate) veya drop_while(predicate)(collection).
Örnek: drop_while
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>
void print(auto&& v)
{
for (auto&& x : v)
{
std::cout << x << ' ';
}
std::cout << '\n';
}
int main()
{
std::vector<int> v{ 0, 1, 2, 3, -4, 5, 6 };
auto myView = std::views::drop_while(
v,
[](int i) {return i >= 0; });
print(myView); // -4 5 6
auto myView2 = v | std::views::drop_while(
[](int i) {return i < 5; });
print(myView2); // 5 6
}
-4 5 6
5 6
elements
Bir elements_viewaralıktaki her tanımlama grubu benzeri değerde seçili dizinin bir görünümü olan bir oluşturun. Örneğin, bir değer aralığı std::tuple<string, int> göz önünde bulundurulduğunda, her bir tanımlama grubundaki elements_view tüm öğelerden bir string oluşturun.
template<ranges::viewable_range R, size_t N>
constexpr ranges::view auto elements<N>(R&& rg);
Parametreler
N
Görünüme eklenecek her tanımlama grubu benzeri değerden seçecek öğenin dizini.
R
Temel alınan aralığın türü.
rg
Görünümün oluşturulacağı demet benzeri değerler aralığı.
Dönüş değeri
Bir elements_view koleksiyondaki her tanımlama grubu benzeri değerde seçilen dizinden oluşan bir.
Örnek: elements
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <map>
#include <string>
int main()
{
std::map<std::string, int> cpp_standards
{
{"C++98", 1998},
{"C++03", 2003},
{"C++11", 2011},
{"C++14", 2014},
{"C++17", 2017},
{"C++20", 2020}
};
// Create an elements_view of all the string elements from each tuple
for (int const year : std::views::elements<1>(cpp_standards))
{
std::cout << year << ' '; // 2003 2011 2014 2017 1998 2020
}
std::cout << '\n';
// Another way, using |: create an elements_view of all the int elements from each tuple
for (auto&& name : cpp_standards | std::views::elements<0>)
{
std::cout << name << ' '; // C++03 C++11 C++14 C++17 C++98 c++20
}
}
2003 2011 2014 2017 1998 2020
C++03 C++11 C++14 C++17 C++98 c++20
empty
Öğesi olmayan bir görünüm olan bir empty_viewoluşturun.
template<class T>
inline constexpr empty_view<T> empty{};
Parametreler
T
Görünümdeki öğelerin türü. Hiçbir öğe olmasa bile görünümün bir öğe türüne ihtiyacı vardır.
Dönüş değeri
Bir empty_view.
Açıklamalar
bir empty_view görünümü gerektiren ancak öğelerini işlemesi gerekmeyen kodu çağırırken yararlı olabilir.
Örnek: empty
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
int main()
{
auto anEmptyView = std::views::empty<int>;
bool isNotEmpty = (bool)anEmptyView;
std::cout << boolalpha << isNotEmpty << "\n"; // false
}
false
filter
Belirtilen koşulla eşleşen bir aralığın öğelerini içeren bir görünüm oluşturun.
1) template<ranges::viewable_range R, class P>
requires {filter_view(forward<R>(rg), forward<P>(predicate));}
constexpr ranges::view auto filter(R&& rg, P&& predicate);
2) template<class P>
constexpr /*range adaptor closure*/ filter(P&& predicate);
Parametreler
P
Koşulun türü.
predicate
Aralıkta tutulacak öğeleri belirleyen koşullar.
R
Temel alınan aralığın türü.
rg
Görünümün oluşturulacağı aralık.
Dönüş değeri
Koşulla filter_view eşleşen bir aralığın öğelerini içeren.
Açıklamalar
Verimlilik adına, ve bir boru filterile birlikte kullandığınızda transform|, yalnızca saklamak istediğiniz öğeleri sağlamak için ilkini filter yapıntransform.
Daha önce "2)" olarak gösterilen kod, kanal söz dizimi ile kullanılabilir: collection | filter(predicate). Ya da işlev çağrısı söz dizimi ile kullanılabilir: filter(collection, predicate) veya filter(predicate)(collection).
Örnek: filter
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>
void print(auto&& v)
{
for (auto&& x : v)
{
std::cout << x << ' ';
}
std::cout << '\n';
}
int main()
{
std::vector<int> v{0, 1, 2, 3, -4, 5, 6};
auto myView = std::views::filter(v, [](int i) {return i < 5; });
print(myView); // 0 1 2 3 -4
auto myView2 = v | std::views::filter([](int i) {return i < 5; }); // pipe syntax
print(myView2); // 0 1 2 3 -4
}
0 1 2 3 -4
0 1 2 3 -4
iota
Artan değerler dizisi içeren bir görünüm oluşturun. Sıra sınırlanabilir veya sınırlanamaz.
template<class V>
constexpr ranges::view auto iota(V&& startValue); // create an unbounded sequence of incrementing values
template<class V, class E>
constexpr ranges::view auto iota(V&& startValue, E&& endValue); // create a bounded sequence of incrementing values
Parametreler
E
Bitiş değerinin türü.
S
Başlangıç değerinin türü.
startValue
Dizideki ilk değer.
endValue
Bu değer, dizideki son değeri geçmiştir. Örneğin, std::views::iota(0, 5) değerlerine 0,1,2,3,4sahip bir görünüm oluşturur.
Dönüş değeri
Artan iota_view değer dizilerinden biri.
Açıklamalar
İlişkisiz bir dizi için, veri türünün maksimum değerine ulaşıldıktan sonra davranış tanımlanmamış olur.
Örnek: iota
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
void print(auto&& v)
{
for (auto&& x : v)
{
std::cout << x << ' ';
}
std::cout << '\n';
}
int main()
{
// create an iota view with its range adaptor (preferred)
print(std::views::iota(0, 5)); // outputs 0 1 2 3 4
// create an iota_view class directly
std::ranges::iota_view letters{'a', 'f'};
print(letters); // a b c d e
}
0 1 2 3 4
a b c d e
istream
Akışın öğeleri üzerinde bir görünüm oluşturun.
template <class Val>
views::istream<Val>(str);
Parametreler
str
Akış nesnesi. Türü, bir uzmanlığından std::basic_istreamtüretilir.
Val
Akıştan ayıklanan öğelerin türü.
Dönüş değeri
Bir basic_istream_view.
Bu aralık bağdaştırıcısı, türü ranges::basic_istream_view<Val, typename U::char_type, typename U::traits_type>(str)olan U ile eşdeğerdirstr.
Örnek: istream
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <sstream>
#include <vector>
int main()
{
std::istringstream doubles{"1.1 2.2 3.3 4.4 5.5"};
for (const auto& elem : std::views::istream<double>(doubles))
{
std::cout << elem << ' '; // 1.1 2.2 3.3 4.4 5.5
}
}
1.1 2.2 3.3 4.4 5.5
join
Birden çok aralığın tüm öğelerini tek bir görünümde birleştiren bir görünüm oluşturun.
1) template <ranges::viewable_range R>
[[nodiscard]] constexpr ranges::view auto join(R&& rg) const noexcept;
2) inline constexpr /*range adaptor closure*/ join();
Parametreler
R
Temel alınan aralığın türü.
rg
Görünümün oluşturulacağı aralık.
Dönüş değeri
join_view Temel alınan aralıktaki tüm aralıkların öğelerini içeren bir.
Örnek: join
#include <iostream>
#include <vector>
#include <ranges>
#include <string>
int main()
{
// a range of two ranges
std::vector<std::string> rangeOfRanges[2]{{"C++20", "contains:"}, {"ranges", "modules", "concepts & more."}};
for (const auto& elem : std::views::join(rangeOfRanges))
{
std::cout << elem << ' ';
}
}
C++20 contains: ranges modules concepts & more.
Açıklamalar
Daha önce "2)" olarak gösterilen kod, kanal söz dizimi ile kullanılabilir: collection | join. Veya işlev çağrısı söz dizimi ile kullanılabilir: join(collection).
keys
keys_view Bir koleksiyondaki her tanımlama grubu benzeri değerde ilk dizinden bir oluşturun. Bu, ilişkilendirici kapsayıcılardan anahtar ayıklamak için kullanışlıdır. Örneğin, bir aralığı std::tuple<string, int>göz önünde bulundurulduğunda, her bir tanımlama grubundaki string tüm öğelerden oluşan bir görünüm oluşturun.
template <ranges::viewable_range R>
constexpr auto keys(R&& rg);
Parametreler
R
Temel alınan aralığın türü.
Dönüş değeri
keys_view Aralıktaki her tanımlama grubu benzeri değerdeki ilk dizinden oluşan bir.
Örnek: keys
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <map>
#include <string>
#include <vector>
int main()
{
// ========== extract keys from a map
std::map<std::string, int> cpp_standards
{
{"C++98", 1998},
{"C++03", 2003},
{"C++11", 2011},
{"C++14", 2014},
{"C++17", 2017},
{"C++20", 2020}
};
// Extract all of the keys from the map
for (std::string standards : std::views::keys(cpp_standards))
{
std::cout << standards << ' '; // C++03 C++11 C++14 C++17 C++98 C++20
}
std::cout << '\n';
// ========== Extract keys from a pair
std::vector<std::pair<std::string, int>> windows
{
{"Windows 1.0", 1985},
{"Windows 2.0", 1987},
{"Windows 3.0", 1990},
{"Windows 3.1", 1992},
{"Windows NT 3.1", 1993},
{"Windows 95", 1995},
{"Windows NT 4.0", 1996},
{"Windows 95", 1995},
{"Windows 98", 1998},
{"Windows 1.0", 1985},
{"Windows 2000", 2000}
};
// Another way to call the range adaptor is by using '|'
for (std::string version : windows | std::views::keys)
{
std::cout << version << ' '; // Windows 1.0 Windows 2.0 Windows 3.0 ...
}
}
C++03 C++11 C++14 C++17 C++98 C++20
Windows 1.0 Windows 2.0 Windows 3.0 Windows 3.1 Windows NT 3.1 Windows 95 Windows NT 4.0 Windows 95 Windows 98 Windows 1.0 Windows 2000
lazy_split
Bir aralığı sınırlayıcıya göre alt aralıklara bölün. Sınırlayıcı tek bir öğe veya öğelerin görünümü olabilir.
1) template<viewable_range R, class Pattern>
constexpr view auto lazy_split(R&& rg, Pattern&& delimiter);
2) template<class Pattern>
constexpr /*range adaptor closure*/ lazy_split(Pattern&& delimiter);
Parametreler
delimiter
Tek bir değer veya aralığın nereye bölüneceğini belirten bir değer dizisi.
Pattern
Sınırlayıcının türü.
R
Bölünecek aralığın türü.
rg
Bölünecek aralık.
Dönüş değeri
Bir lazy_split_view veya daha fazla alt düzenleme içeren ve özgün aralığın üzerinde delimiterbölünmesinin sonucu olan.
Açıklamalar
Sınırlayıcı sonucun bir parçası değildir. Örneğin, değerinin aralığını 1,2,32bölerseniz iki alt alanınız olur: 1 ve 3.
İlgili bir bağdaştırıcıdır split. ile split_view arasındaki lazy_split_view birincil farklar şunlardır:
| Görünüm | Aralığı const bölebilir |
Aralık yineleyicisi |
|---|---|---|
split_view |
hayır | Destekler forward_range veya üzeri |
lazy_split_view |
evet |
input_range veya üzeri |
Daha verimli olduğundan, olan bir aralığı split_viewbölmeniz gerekmediği sürece tercih edebilirsinizconst.
Daha önce "2)" olarak gösterilen kod, kanal söz dizimi ile kullanılabilir: collection | lazy_split(delimiter). Ya da işlev çağrısı söz dizimi ile kullanılabilir: lazy_split(collection, delimiter) veya lazy_split(delimiter)(collection).
Örnek: lazy_split
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> rg{1, 2, 3, 1, 2, 3, 4, 5, 6};
// split on a single element
for (const auto& sub : rg | std::views::split(3))
{
// outputs:
// 1 2
// 1 2
// 4 5 6
for (const auto& elem : sub)
{
std::cout << elem << ' ';
}
std::cout << '\n';
}
// split on a sequence of elements
int delimiters[] = {2, 3};
for (const auto& subrange : std::views::split(rg, delimiters))
{
// outputs 1 1 4 5 6
for (auto& i : subrange)
{
std::cout << i << " ";
}
}
}
1 2
1 2
4 5 6
1 1 4 5 6
reverse
Bir aralığın öğelerinin ters sırada bir görünümünü oluşturun.
1) template<viewable_range R>
constexpr ranges::view auto reverse(R&& rg);
2) inline constexpr /*range adaptor closure*/ reverse();
Parametreler
R
Ters çevrilecek temel aralığın türü.
rg
Geri çevrilecek aralık.
Dönüş değeri
Temel alınan aralığın öğelerini ters sırada sunan bir görünüm. Döndürülen görünüm genellikle, ancak her zaman değil, bir uzmanlığıdır reverse_view. Bunun anlamı:
- bir uzmanlığı
Visereverse_view, sonuç bağımsız değişkenin temel görünümüdür. Çift ters işlem yapılmaz (işlem yoktur). - biçimine
Vsahipsesubrange<reverse_iterator<I>, reverse_iterator<I>>, sonuç, çizilmemiş yineleyicilerin birsubrangesonucudur. Çift ters, operasyon yapılmaz. - Aksi takdirde, sonuç bir
reverse_viewşeklindedir.
Açıklamalar
Daha önce "2)" olarak gösterilen kod, kanal söz dizimi ile kullanılabilir: collection | reverse. Veya işlev çağrısı söz dizimi ile kullanılabilir: reverse(collection).
Örnek: reverse
// 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 };
auto rv = v | std::views::reverse; // using the pipe syntax
for (auto &&e : rv) // outputs 6 5 -4 3 2 1 0
{
std::cout << e << ' ';
}
std::cout << '\n';
// using the range adaptor without using the pipe syntax
auto rv2 = std::views::reverse(v);
for (auto &&e : rv2) // outputs 6 5 -4 3 2 1 0
{
std::cout << e << ' ';
}
}
6 5 -4 3 2 1 0
6 5 -4 3 2 1 0
single
Bir single_viewöğe içeren bir görünüm olan bir oluşturun.
template<class T>
constexpr ranges::view auto single(T&& t);
Parametreler
T
Görünümdeki öğenin türü.
t
Görünümde depoacak öğenin değeri.
Dönüş değeri
single_view öğesini içeren tbir .
Açıklamalar
Bu görünüm, içinde en az bir öğe bulunan bir görünümle sağlanması gereken kodu çağırmak için test amacıyla kullanışlıdır.
Örnek: single
// requires /std:c++20 or later
#include <ranges>
#include <string>
#include <tuple>
#include <iostream>
int main()
{
auto sv = std::views::single(7);
std::cout << sv.front() << " " << *sv.data() << "\n"; // 7 7
auto sv2 = std::views::single(<std::tuple<double, std::string>{6502, "8-bit"});
std::cout << std::get<0>(sv2[0]) << " " << std::get<1>(sv2[0]) << "\n"; // 6502 8-bit
}
7 7
6502 8-bit
split
Bir görünümü sınırlayıcıya göre alt bölümlere ayırın. Sınırlayıcı tek bir öğe veya öğe dizisi olabilir.
1) template<viewable_range R, class Pattern>
constexpr view auto split(R&& rg, Pattern&& delimiter);
2) template<class Pattern>
constexpr /*range adaptor closure*/ split(Pattern&& delimiter);
Parametreler
delimiter
Tek bir değer veya aralığın nereye bölüneceğini belirten bir değer dizisi.
Pattern
Sınırlayıcının türü.
R
Bölünecek temel aralığın türü.
rg
Bölünecek aralık.
Dönüş değeri
Bir split_view veya daha fazla alt düzenleme içeren bir.
Açıklamalar
Sınırlayıcı sonucun bir parçası değildir. Örneğin, değerinin aralığını 1,2,32bölerseniz iki alt alanınız olur: 1 ve 3.
İlgili bir bağdaştırıcıdır lazy_split. ile split_view arasındaki lazy_split_view birincil farklar şunlardır:
| Görünüm | Aralığı const bölebilir |
Aralık türü |
|---|---|---|
split_view |
hayır | Destekler forward_range veya üzeri |
lazy_split_view |
evet | Destekler input_range veya üzeri |
Daha verimli olduğundan, olan bir aralığı split_viewbölmeniz gerekmediği sürece tercih edebilirsinizconst.
Daha önce "2)" olarak gösterilen kod, kanal söz dizimi ile kullanılabilir: collection | split(delimiter). Ya da işlev çağrısı söz dizimi ile kullanılabilir: split(collection, 5) veya split(5)(collection).
Örnek: split
// requires /std:c++20 or later
#include <ranges>
#include <vector>
#include <iostream>
int main()
{
std::vector<int> rg{ 1, 2, 3, 1, 2, 3, 4, 5, 6 };
// split on a single element, 3
for (const auto& sub : rg | std::views::split(3))
{
// This prints out:
// 1,2
// 4,5,6
for (const auto& elem : sub)
{
std::cout << elem << ' ';
}
std::cout << '\n';
}
// split on a sequence of elements, 2,3
int delimiters[] = {2, 3};
for (const auto& subrange : std::views::split(rg, delimiters))
{
// outputs 1 1 4 5 6
for (auto& i : subrange)
{
std::cout << i << " ";
}
}
}
1 2
1 2
4 5 6
1 1 4 5 6
take
Bir aralığın önünden alınan belirtilen sayıda öğeyi içeren bir görünüm oluşturun.
1) template<ranges::viewable_range R>
constexpr ranges::view auto take(R&& rg, ranges::range_difference_type<R> count);
2) template<class DifferenceType>
constexpr /*range adaptor closure*/ take(DifferenceType&& count);
Parametreler
R
Temel alınan aralığın türü.
rg
Görünümün oluşturulacağı aralık.
count
önünden rgalınması gereken öğe sayısı.
Dönüş değeri
Döndürülen görünüm genellikle, ancak her zaman değil, bir uzmanlığıdır take_view. Özellikle:
- , veya
Vuzmanlık alanı ise ,empty_view,spanveyabasic_string_viewher ikisiiota_viewde vesubrangeise, sonuç bir uzmanlığıdırrandom_access_range.sized_rangeV - Aksi takdirde, sonuç bir
take_viewşeklindedir.
Açıklamalar
Alınacak öğe sayısı içinde rgvar olandan daha fazla öğe belirtirseniz, tüm öğeler alınır.
take , öğesinin tersidir drop.
Daha önce "2)" olarak gösterilen kod, kanal söz dizimi ile kullanılabilir: collection | take(5). Ya da işlev çağrısı söz dizimi ile kullanılabilir: take(5, collection) veya take(5)(collection).
Örnek: take
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::string s{ "abcdefg" };
auto myView = std::views::take(s, 3);
for (auto c : myView)
{
std::cout << c << ' '; // a b c
}
std::cout << std::endl;
for (auto c : s | std::views::take(3)) // pipe syntax
{
std::cout << c << ' '; // a b c
}
}
a b c
a b c
take_while
Belirtilen koşulla eşleşen bir aralığın önde gelen öğelerini içeren bir görünüm oluşturun.
1) template<ranges::viewable_range R, class P>
constexpr ranges::view auto take_while(R&& rg, P&& predicate);
2) template<class P>
constexpr /*range adaptor closure*/ take_while(P&& predicate);
Parametreler
P
Koşulun türü.
predicate
Aralıktan hangi önde gelen öğelerin kopyalandığını belirleyen koşullar.
R
Temel alınan aralığın türü.
rg
Görünümün oluşturulacağı aralık.
Dönüş değeri
take_while_view Aralıkta belirtilen ölçütleri karşılayan ilk count öğelerden oluşan bir.
Açıklamalar
Koşul döndürdüğünde rg veya aralıkta öğe false tükendikten sonra öğesi almayı durdurur.
take_while , öğesinin tersidir drop_while.
Daha önce "2)" olarak gösterilen kod, kanal söz dizimi ile kullanılabilir: collection | take_while(pred). Ya da işlev çağrısı söz dizimi ile kullanılabilir: take_while(collection, pred) veya take_while(pred)(collection).
Örnek: take_while
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>
void print(auto&& v)
{
for (auto&& x : v)
{
std::cout << x << ' ';
}
std::cout << '\n';
}
int main()
{
std::vector<int> v{ 0, 1, 2, 3, -4, 5, 6 };
auto myView = std::views::take_while(
v, [](int i) {return i >= 0; });
print(myView); // 0 1 2 3
print(v | std::views::take_while( // 0 1 2 3 -4
[](int i) {return i < 5; })); // pipe syntax
}
0 1 2 3
0 1 2 3 -4
transform
Her biri belirtilen aralıktaki bir öğenin dönüşümü olan öğelerin görünümünü oluşturun.
1) template<viewable_range R, class F>
constexpr ranges::view auto transform(R&& rg, F&& fun);
2) template<class F>
constexpr /*range adaptor closure*/ transform(F&& fun);
Parametreler
F
Öğeleri dönüştürmek için işlev nesnesinin türü.
R
Temel alınan aralığın türü.
fun
Öğeleri dönüştüren işlev.
rg
Görünümün oluşturulacağı aralık.
Dönüş değeri
öğesinin transform_view dönüştürülmüş öğelerini rgiçeren bir.
Açıklamalar
Verimlilik adına, ve oluştururken filter ilkini transform yapın; böylece filter yalnızca saklamak istediğiniz öğelere sahip olursunuz.transform
Daha önce "2)" olarak gösterilen kod, kanal söz dizimi ile kullanılabilir: collection | transform(fun). Ya da işlev çağrısı söz dizimi ile kullanılabilir: transform(collection, fun) veya transform(fun)(collection).
Örnek: transform
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>
void print(auto&& v)
{
for (auto&& x : v)
{
std::cout << x << ' ';
}
std::cout << '\n';
}
int main()
{
std::vector<int> v{0, 1, 2, 3, -4, 5, 6};
auto myView = std::views::transform(v, [](int i) {return i * 2; });
print(myView); // 0 2 4 6 -8 10 12
print(v | std::views::transform( // 0 2 4 6 -8 10 12
[](int i) {return i * 2; })); // pipe syntax
}
0 2 4 6 -8 10 12
0 2 4 6 -8 10 12
values
values_view Bir koleksiyondaki her tanımlama grubu benzeri değerde ikinci dizinden oluşan bir oluşturun. Bu, ilişkilendirici bir kapsayıcıdaki değerlerin görünümünü oluşturmak için kullanışlıdır. Örneğin, bir değer aralığı std::tuple<string, int> göz önünde bulundurulduğunda, her bir tanımlama grubundaki int tüm öğelerden oluşan bir görünüm oluşturun.
template <ranges::viewable_range R>
constexpr ranges::view auto values(R&& rg);
Parametreler
R
Temel alınan aralığın türü.
rg
Tanımlama grubu benzeri değerlerin temel aralığı.
Dönüş değeri
values_view İkinci dizinden aralıktaki her tanımlama grubu benzeri değere yerleşik bir değer.
Örnek: values
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <map>
#include <string>
#include <vector>
int main()
{
// ========== working with a map
std::map<std::string, int> cpp_standards
{
{"C++98", 1998},
{"C++03", 2003},
{"C++11", 2011},
{"C++14", 2014},
{"C++17", 2017},
{"C++20", 2020}
};
// Extract all of the years from the map
for (int years : std::views::values(cpp_standards))
{
std::cout << years << ' '; // 2003 2011 2014 2017 1998 2020
}
std::cout << '\n';
// ========== working with pairs
std::vector<std::pair<std::string, int>> windows
{
{"Windows 1.0", 1985},
{"Windows 2.0", 1987},
{"Windows 3.0", 1990},
{"Windows 3.1", 1992},
{"Windows NT 3.1", 1993},
{"Windows 95", 1995},
{"Windows NT 4.0", 1996},
{"Windows 95", 1995},
{"Windows 98", 1998},
{"Windows 1.0", 1985},
{"Windows 2000", 2000}
};
// Another way to call the range adaptor by using '|'
// Create a values_view that contains the year from each pair
for (int years : windows | std::views::values)
{
std::cout << years << ' '; // 1985 1987 1990 1992 ...
}
}
2003 2011 2014 2017 1998 2020
1985 1987 1990 1992 1993 1995 1996 1995 1998 1985 2000
Aralık bağdaştırıcı türü diğer adları
all_t
Döndüren görünümün all türünü sağlar.
template <ranges::viewable_range R>
using all_t = decltype(views::all(std::declval<R>()));
Parametreler
R
Temel alınan aralığın türü.
Dönüş değeri
Döndüren görünümün all türü: decltype(views::all(std::declval<R>())).
Örnek: all_t
#include <ranges>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = {1,2,3,4,5,6,7,8,9,10};
auto myView = std::views::all(v);
std::views::all_t<decltype((v))> &viewType = myView;
}