Aracılığıyla paylaş


<ranges> işlevleri

<ranges>C++20 üst bilgisi aşağıdaki üye olmayan yardımcı işlevleri içerir.

Üye olmayan işlevler Açıklama
beginC++20 Aralıktaki ilk öğeye bir yineleyici alın.
cbeginC++20 Aralıktaki ilk öğeye bir const yineleyici alın.
cendC++20 -qualified aralığının sonundaki sentinel'i constalın.
cdataC++20 const Bitişik aralıktaki ilk öğeye bir işaretçi alın.
crbeginC++20 Aralığın başına ters const bir yineleyici alın.
crendC++20 Dönüşlerin sonunda sentinel'i crbegin() alın.
dataC++20 Bitişik aralıktaki ilk öğeye bir işaretçi alın.
emptyC++20 Aralığın boş olup olmadığını test edin.
endC++20 Aralığın sonundaki sentinel'i alın.
rbeginC++20 Aralığın başına ters bir yineleyici alın.
rendC++20 Aralığın sonundaki sentinel için ters yineleyici alın.
sizeC++20 Aralığın boyutunu işaretsiz bir değer olarak alın.
ssizeC++20 Aralığın boyutunu imzalı değer olarak alır.

Bu 'işlevlerin' çoğu özelleştirme noktası nesneleri olarak uygulanır. Özelleştirme noktası nesnesi, kullanıcı tanımlı türlerde aşırı yüklenebilen bir işlev nesnesidir ve aynı zamanda işlev nesnesine hangi tür türlerinin geçirilebileceğine yönelik kısıtlamalar da zorunlu hale getirin. Bunun net etkisi, derleyicinin geçirilen türü için çağrı yapmak için geçerli bir özelleştirilmiş işlev olup olmadığını veya varsayılan uygulamanın kullanılması gerekip gerekmediğini veya çağrının kötü biçimlendirilmiş olup olmadığını anladığıdır.

Bu işlevlerin birçoğunun ad alanında std karşılık gelen işlevleri vardır. Ancak aralıklarla çalışırken bunun yerine bu yardımcı işlevleri kullanın. Bu işlevler, daha iyi derleme zamanı hataları sağlayan C++20 kavramlarını kullanır. Bunlar özelleştirme noktaları olarak uygulandığından bağımsız değişkene bağımlı arama (ADL) ve sabit doğrulukla ilgili sorunlardan kaçınılır.

begin

Aralıktaki ilk öğeye bir yineleyici alın.

template<class T>
constexpr std::input_or_output_iterator auto begin(T&& rg);

Parametreler

T
Aralığın türü.

rg
Bir aralık.

Dönüş değeri

Aralıktaki ilk öğeye bir yineleyici:

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.

Aralık bir diziyse, eşdeğerini rg + 0döndürür. auto(rg.begin()) Yineleyici verirse, eşdeğerini auto(rg.begin())döndürür. Bu ifade hatalı biçimlendirilmişse, auto(begin(rg)) bu ifade yineleyici verirse kullanılır.

Açıklamalar

ranges::begin() tüm aralıklarda çalışır, ancak std::begin() çalışmayabilir.

Örnek: begin

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

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto vi = std::ranges::begin(v);
    std::cout << *vi << ' ' << *++vi; // outputs 10 20
}

cbegin

Aralıktaki const ilk öğeye yineleyici alma. Yineleyici aralıktaki öğelere erişebilir, ancak bunları değiştiremez.

template<class T>
constexpr std::input_or_output_iterator auto cbegin(T&& rg);

Parametreler

T
Aralığın türü.

rg
Bir aralık.

Dönüş değeri

const Aralıktaki ilk öğeye bir yineleyici:

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

Aralık bir diziyse, eşdeğerini rg + 0döndürür. auto(rg.cbegin()) Yineleyici verirse, eşdeğerini auto(rg.cbegin())döndürür. Bu ifade hatalı biçimlendirilmişse, auto(cbegin(rg)) bu ifade yineleyici verirse kullanılır.

Açıklamalar

ranges::cbegin() tüm aralıklarda çalışır, ancak std::cbegin() çalışmayabilir.

Örnek: cbegin

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

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto vi = std::ranges::cbegin(v);
    std::cout << *vi; // outputs 10
    // *vi = 100; // error because the iterator is const
}

cdata

const Bitişik aralıktaki ilk öğeye bir işaretçi alın.

template<class T>
constexpr std::add_pointer_t<ranges::range_reference_t<const T>> cdata(T&& rg);

Parametreler

T
Aralığın türü.

rg
Bir aralık.

Dönüş değeri

const Aralık türüne bağlı olarak bitişik aralıktaki ilk öğe verilerine yönelik bir işaretçi. Örneğin, aralık tamsayılardan oluşan bir vektörse, dönüş değerinin türü bir const int *olur.

Örnek: cdata

#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    std::string src{ "a string" };
   
    auto c_charPtr = std::ranges::cdata(src); // ptr is a const char *
    auto c_intPtr = std::ranges::cdata(v); // ptr2 is a const int *
    std::cout << c_charPtr << ", " << *c_intPtr << '\n'; // outputs a string, 10

    // *c_intPtr = 100; // error - cannot assign to a const pointer
    // *charPtr = 'A'; // error - cannot assign to a const pointer
}

cend

-qualified aralığının sonundaki sentinel'i constalın. Yineleyici aralıktaki öğelere erişebilir, ancak bunları değiştiremez.

template<class T>
constexpr std::sentinel_for<decltype(ranges::cbegin(std::declval<T>()))> auto cend(T&& rg);

Parametreler

T
Aralığın türü.

rg
Bir aralık.

Dönüş değeri

-qualified aralığındaki son öğeyi constizleyen sentinel:

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

Açıklamalar

ranges::cend() tüm aralıklarda çalışır, ancak std::cend() çalışmayabilir.

Örnek: cend

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

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto i = std::ranges::cend(v);
    --i; // get off the sentinel and onto the last element in the range
    std::cout << *i; // outputs 30
    // *i = 300 // error because the iterator is const
}

crbegin

Ters çevrilmiş aralıktaki ilk öğeye ters const yineleyici alın. Ters yineleyici, aralığın öğelerini ters sırada döndürür. Aralığın kendisi ters çevrilmiyor; erişimi vardır.

template<class T>
constexpr std::input_or_output_iterator auto crbegin(T&& rg);

Parametreler

T
Aralığın türü.

rg
Bir aralık.

Dönüş değeri

Aralıktaki ilk öğeye ters const yineleyici. Bu yineleyici, aralığın sonundan başlayarak aralığın öğelerini ters sırada döndürür:

10, 20 ve 30 öğelerini içeren bir vektör resmi. En soldaki öğeden (en soldaki öğe 10 sayısını içerir) önce sentinel öğesini temsil eden bir sanal kutu vardır. Crend() olarak etiketlenmiştir. Vektördeki ilk öğe 10 sayısını içerir ve 'son öğe' olarak etiketlenmiştir. Vektördeki en sağdaki öğe 30 içerir ve crbegin() olarak etiketlenmiştir.

Aralık bir diziyse, dizideki öğelerin sayısı olan konumun n eşdeğerini reverse_iterator{rg + n} döndürür. auto(rg.crbegin()) Yineleyici verirse, eşdeğerini auto(rg.crbegin())döndürür. Bu ifade hatalı biçimlendirilmişse, auto(crbegin(rg)) bu ifade yineleyici verirse kullanılır.

Açıklamalar

ranges::crbegin() tüm çift yönlü aralıklarda çalışır, ancak std::crbegin() çalışmayabilir.

Örnek: crbegin

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

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::crbegin(v);
    std::cout << *vi << ' ' << *++vi << ' ' << *++vi; // outputs 30 20 10
    // vi[1] = 100; // error because the iterator is const
}

crend

Dönüşlerin sonunda sentinel'i crbegin() alın. Ters yineleyici, aralığın öğelerini ters sırada döndürür. Aralığın kendisi ters çevrilmiyor; erişimi vardır.

template<class T>
std::sentinel_for<decltype(ranges::crbegin(declval<T>()))> auto crend(T&& rg);

Parametreler

T
Aralığın türü.

rg
Bir aralık.

Dönüş değeri

Dönüşlerin sonundaki cbegin() sentinel. Sentinel, aralığın ters çevrilmiş görünümündeki son öğeyi izler:

10, 20 ve 30 öğelerini içeren bir vektör resmi. En soldaki öğeden (en soldaki öğe 10 sayısını içerir) önce sentinel öğesini temsil eden bir sanal kutu vardır. Crend() olarak etiketlenmiştir. Vektördeki ilk öğe 10 sayısını içerir ve 'son öğe' olarak etiketlenmiştir. Vektördeki en sağdaki öğe 30 içerir ve crbegin() olarak etiketlenmiştir.

Açıklamalar

ranges::crend() tüm çift yönlü aralıklarda çalışır, ancak std::crend() çalışmayabilir.

crend örnek

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

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::crend(v);
    --vi; // get off the sentinel and onto the last element in the reversed range
    std::cout << *vi; // outputs 10
    // vi[0] = 300; // error because the iterator is const    
    std::cout << *vi << ' ' << *--vi << ' ' << *--vi; // outputs 10, 20, 30
}

data

Bitişik aralıktaki ilk öğeye bir işaretçi alın.

template<class T>
constexpr std::add_pointer_t<ranges::range_reference_t<T>> data(T&& rg);

Parametreler

T
Aralığın türü.

rg
Bir aralık.

Dönüş değeri

Aralık türüne göre bitişik aralıktaki ilk öğeye yönelik bir işaretçi. Örneğin, aralık tamsayılardan oluşan bir vektörse, dönüş değerinin türü bir int *olur.

Örnek

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

int main()
{
    std::vector v{10, 20, 30};
    std::string src{ "a string" };
   
    auto charPtr = std::ranges::data(src); // charPtr is a char *
    auto intPtr = std::ranges::data(v); // intPtr is an int *
    std::cout << charPtr << ", " << *intPtr << '\n'; // outputs a string, 10
    *intPtr = 100;
    *charPtr = 'A';
    std::cout << charPtr << ", " << *intPtr; // outputs A string, 100
}

empty

Aralığın boş olup olmadığını test edin.

template<class T>
constexpr bool empty(T&& rg);

Parametreler

T
Aralığın türü.

rg
Bir aralık.

Dönüş değeri

Aralıkta öğe yoksa döndürür true ; aksi takdirde false.

Örnek

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

int main()
{
        std::vector v{10,20,30};
    std::vector<int> v2;

    std::cout << std::boolalpha << std::ranges::empty(v); // outputs false
    std::cout << std::boolalpha << ", " << std::ranges::empty(v2); // outputs true
}

end

Aralığın sonundaki sentinel'i alın.

template<class T>
std::sentinel_for<ranges::iterator_t<T>> auto end(T&& rg);

Parametreler

T
Aralığın türü.

rg
Bir aralık.

Dönüş değeri

Aralıktaki son öğeyi izleyen 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.

Açıklamalar

ranges::end() tüm aralıklarda çalışır, ancak std::end() çalışmayabilir.

Örnek

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

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto i = std::ranges::end(v);
    --i; // get off the sentinel and onto the last element in the range
    std::cout << *i; // outputs 30
}

rbegin

Ters çevrilmiş aralıktaki ilk öğeye ters yineleyici alın. Ters yineleyici, aralığın öğelerini ters sırada döndürür. Aralığın kendisi ters çevrilmiyor; erişimi vardır.

template<class T>
constexpr std::input_or_output_iterator auto rbegin(T&& rg);

Parametreler

T
Aralığın türü.

rg
Bir aralık.

Dönüş değeri

Aralıktaki ilk öğeye ters yineleyici. Bu yineleyici, ters çevrilmiş aralığın sonundan başlayarak aralığın öğelerini ters sırada döndürür:

10, 20 ve 30 öğelerini içeren bir vektör resmi. En soldaki öğeden (en soldaki öğe 10 sayısını içerir) önce sentinel öğesini temsil eden bir sanal kutu vardır. Rend() olarak etiketlenmiştir. Vektördeki ilk öğe 10 sayısını içerir ve 'son öğe' olarak etiketlenmiştir. Vektördeki en sağdaki öğe 30 içerir ve rbegin() olarak etiketlenmiştir.

Aralık bir diziyse, dizideki öğelerin sayısı olan konumun n eşdeğerini reverse_iterator{rg + n} döndürür. auto(rg.rbegin()) Yineleyici verirse, eşdeğerini auto(rg.rbegin())döndürür. Bu ifade hatalı biçimlendirilmişse, auto(rbegin(rg)) bu ifade yineleyici verirse kullanılır.

Açıklamalar

ranges::rbegin() tüm çift yönlü aralıklarda çalışır, ancak std::rbegin() çalışmayabilir.

Örnek

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

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::rbegin(v);
    std::cout << *vi << ' ' << *++vi << ' ' << *++vi; // outputs 30 20 10
}

rend

Aralığın tersine çevrilmiş görünümünün sonunda sentinel'e ters yineleyici alın. Ters yineleyici, aralığın öğelerini ters sırada döndürür. Aralığın kendisi ters çevrilmiyor; erişimi vardır.

template<class T>
constexpr 
std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))> auto rend(T&& rg);

Parametreler

T
Aralığın türü.

rg
Bir aralık.

Dönüş değeri

Aralığın sonundaki sentinel için ters yineleyici. Sentinel, aralığın ters çevrilmiş görünümündeki son öğeyi izler:

10, 20 ve 30 öğelerini içeren bir vektör resmi. En soldaki öğeden (en soldaki öğe 10 sayısını içerir) önce sentinel öğesini temsil eden bir sanal kutu vardır. Rend() olarak etiketlenmiştir. Vektördeki ilk öğe 10 sayısını içerir ve 'son öğe' olarak etiketlenmiştir. Vektördeki en sağdaki öğe 30 içerir ve rbegin() olarak etiketlenmiştir.

Açıklamalar

ranges::rend() tüm çift yönlü aralıklarda çalışır, ancak std::rend() çalışmayabilir.

Örnek

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

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::rend(v);
    --vi; // get off the sentinel and onto the last element in the reversed range
    std::cout << *vi; // outputs 10
    std::cout << *vi << ' ' << *--vi << ' ' << *--vi; // outputs 10, 20, 30
}

size

Aralıktaki öğelerin sayısını işaretsiz bir değer olarak alır.

template<class T>
constexpr /*unsigned integer-like type */ size(T&& rg);

Parametreler

T
Aralığın türü.

rg
Bir aralık.

Dönüş değeri

Aralıktaki öğelerin işaretsiz tamsayı benzeri bir değer olarak sayısı.

Açıklamalar

Bu işlev sabit sürede yürütülür.

Örnek

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

int main()
{
    std::vector v{10, 20, 30};
    auto s = std::ranges::size(v); // s is a size_t
    std::cout << s; // outputs 3
}

ssize

Aralığın boyutunu imzalı değer olarak alır.

template<class T>
constexpr /* signed-integer-like type */ ssize(T&& rg);

Parametreler

T
Aralığın türü.

rg
Bir aralık.

Dönüş değeri

Aralıktaki öğelerin imzalı tamsayı benzeri bir değer olarak sayısı.

Açıklamalar

Bu işlev sabit sürede yürütülür.

Örnek

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

int main()
{
    std::vector v{10, 20, 30};
    auto s = std::ranges::ssize(v);
    std::cout << s; // outputs 3
}

Ayrıca bkz.

<ranges>
Özelleştirme nesneleri nedir?