<ranges>
函式
<ranges>
C++20 標頭包含下列非成員協助程式函式。
非成員函式 | 說明 |
---|---|
begin C++20 |
取得範圍中第一個專案的反覆運算器。 |
cbegin C++20 |
取得範圍中第一個專案 const 的反覆運算器。 |
cend C++20 |
取得限定範圍結尾的 const sentinel。 |
cdata C++20 |
取得連續範圍中第一個專案 const 的指標。 |
crbegin C++20 |
取得範圍開頭的反向 const 反覆運算器。 |
crend C++20 |
取得傳回內容 crbegin() 結尾的 sentinel。 |
data C++20 |
取得連續範圍中第一個專案的指標。 |
empty C++20 |
測試範圍是否為空白。 |
end C++20 |
取得範圍結尾的 sentinel。 |
rbegin C++20 |
取得範圍開頭的反向反覆運算器。 |
rend C++20 |
取得範圍結尾之 sentinel 的反向反覆運算器。 |
size C++20 |
取得範圍的大小做為不帶正負號的值。 |
ssize C++20 |
取得範圍的大小做為帶正負號的值。 |
其中許多「函式」會實作為 自定義點物件。 自定義點對像是可在 使用者定義型別上多載的函式對象 ,同時強制執行可傳遞至函式物件之類型的條件約束。 net 效果是編譯程式會找出是否有有效的自定義函式要針對傳入的 型別呼叫,或是否應該使用默認實作,或呼叫的格式不正確。
其中許多函式在命名空間中 std
都有對應的函式。 但是,使用範圍時,請改用這些協助程式函式。 這些函式會使用 C++20 概念,以提供更佳的編譯時間錯誤。 因為它們會實作為自定義點,因此會避免與自變數相依查閱 (ADL) 和 const 正確性相關的問題。
begin
取得範圍中第一個專案的反覆運算器。
template<class T>
constexpr std::input_or_output_iterator auto begin(T&& rg);
參數
T
範圍的型別。
rg
範圍。
傳回值
範圍中第一個專案的反覆運算器:
如果範圍是陣列,則傳回的 rg + 0
對等 。
如果 auto(rg.begin())
產生反覆運算器,則傳回的 auto(rg.begin())
對等專案。 如果該表達式的格式不正確, auto(begin(rg))
則當該表達式產生反覆運算器時會使用。
備註
ranges::begin()
適用於所有範圍,但 std::begin()
可能無法運作。
範例: 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
取得範圍 const
中第一個專案的反覆運算器。
反覆運算器可以存取範圍中的專案,但無法加以修改。
template<class T>
constexpr std::input_or_output_iterator auto cbegin(T&& rg);
參數
T
範圍的型別。
rg
範圍。
傳回值
範圍 const
中第一個專案的反覆運算器:
如果範圍是陣列,則傳回的 rg + 0
對等 。
如果 auto(rg.cbegin())
產生反覆運算器,則傳回的 auto(rg.cbegin())
對等專案。 如果該表達式的格式不正確, auto(cbegin(rg))
則當該表達式產生反覆運算器時會使用。
備註
ranges::cbegin()
適用於所有範圍,但 std::cbegin()
可能無法運作。
範例: 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
的指標。
template<class T>
constexpr std::add_pointer_t<ranges::range_reference_t<const T>> cdata(T&& rg);
參數
T
範圍的型別。
rg
範圍。
傳回值
const
以範圍類型為基礎的指標,指向連續範圍中的第一個項目數據。 例如,如果範圍是整數的向量,則傳回值的型別為 const int *
。
範例: 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
取得限定範圍結尾的 const
sentinel。
反覆運算器可以存取範圍中的專案,但無法加以修改。
template<class T>
constexpr std::sentinel_for<decltype(ranges::cbegin(std::declval<T>()))> auto cend(T&& rg);
參數
T
範圍的型別。
rg
範圍。
傳回值
在限定範圍中最後一個項目之後的 const
sentinel:
備註
ranges::cend()
適用於所有範圍,但 std::cend()
可能無法運作。
範例: 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
取得反轉範圍中第一個專案的反向 const
反覆運算器。
反向反覆運算器會以反向順序傳回範圍的元素。
範圍本身不會反轉;存取它為 。
template<class T>
constexpr std::input_or_output_iterator auto crbegin(T&& rg);
參數
T
範圍的型別。
rg
範圍。
傳回值
範圍中第一個專案的反向 const
反覆運算器。 此反覆運算器會以反向順序傳回範圍的元素,從範圍結尾開始:
如果範圍是陣列,則傳回的對等 reverse_iterator{rg + n}
專案 n
是陣列中的項目數目。
如果 auto(rg.crbegin())
產生反覆運算器,則傳回的 auto(rg.crbegin())
對等專案。 如果該表達式的格式不正確, auto(crbegin(rg))
則當該表達式產生反覆運算器時會使用。
備註
ranges::crbegin()
適用於所有雙向範圍,但 std::crbegin()
可能無法運作。
範例: 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
取得傳回內容 crbegin()
結尾的 sentinel。
反向反覆運算器會以反向順序傳回範圍的元素。
範圍本身不會反轉;存取它為 。
template<class T>
std::sentinel_for<decltype(ranges::crbegin(declval<T>()))> auto crend(T&& rg);
參數
T
範圍的型別。
rg
範圍。
傳回值
傳回內容 cbegin()
結尾的 sentinel。 sentinel 會遵循範圍反轉檢視中的最後一個專案:
備註
ranges::crend()
適用於所有雙向範圍,但 std::crend()
可能無法運作。
crend
例
// 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
取得連續範圍中第一個專案的指標。
template<class T>
constexpr std::add_pointer_t<ranges::range_reference_t<T>> data(T&& rg);
參數
T
範圍的型別。
rg
範圍。
傳回值
以範圍類型為基礎的指標,指向連續範圍中的第一個專案。 例如,如果範圍是整數的向量,則傳回值的型別為 int *
。
範例
// 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
測試範圍是否為空白。
template<class T>
constexpr bool empty(T&& rg);
參數
T
範圍的型別。
rg
範圍。
傳回值
如果範圍沒有專案,則傳 true
回 ,否則 false
傳回 。
範例
// 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
取得範圍結尾的 sentinel。
template<class T>
std::sentinel_for<ranges::iterator_t<T>> auto end(T&& rg);
參數
T
範圍的型別。
rg
範圍。
傳回值
在範圍中最後一個項目之後的 sentinel:
備註
ranges::end()
適用於所有範圍,但 std::end()
可能無法運作。
範例
// 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
取得反轉範圍中第一個專案的反向反覆運算器。 反向反覆運算器會以反向順序傳回範圍的元素。 範圍本身不會反轉;存取它為 。
template<class T>
constexpr std::input_or_output_iterator auto rbegin(T&& rg);
參數
T
範圍的型別。
rg
範圍。
傳回值
範圍中第一個專案的反向反覆運算器。 此反覆運算器會以反向順序傳回範圍的元素,從反向範圍結尾開始:
如果範圍是陣列,則傳回的對等 reverse_iterator{rg + n}
專案 n
是陣列中的項目數目。
如果 auto(rg.rbegin())
產生反覆運算器,則傳回的 auto(rg.rbegin())
對等專案。 如果該表達式的格式不正確, auto(rbegin(rg))
則當該表達式產生反覆運算器時會使用。
備註
ranges::rbegin()
適用於所有雙向範圍,但 std::rbegin()
可能無法運作。
範例
// 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
取得範圍反轉檢視結尾之 sentinel 的反向反覆運算器。 反向反覆運算器會以反向順序傳回範圍的元素。 範圍本身不會反轉;存取它為 。
template<class T>
constexpr
std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))> auto rend(T&& rg);
參數
T
範圍的型別。
rg
範圍。
傳回值
範圍結尾之 sentinel 的反向反覆運算器。 sentinel 會遵循範圍反轉檢視中的最後一個專案:
備註
ranges::rend()
適用於所有雙向範圍,但 std::rend()
可能無法運作。
範例
// 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
取得範圍中的項目數目做為不帶正負號的值。
template<class T>
constexpr /*unsigned integer-like type */ size(T&& rg);
參數
T
範圍的型別。
rg
範圍。
傳回值
範圍中的項目數目,以不帶正負號的整數值表示。
備註
此函式會以常數時間執行。
範例
// 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
取得範圍的大小做為帶正負號的值。
template<class T>
constexpr /* signed-integer-like type */ ssize(T&& rg);
參數
T
範圍的型別。
rg
範圍。
傳回值
範圍中的項目數目,以帶正負號的整數值表示。
備註
此函式會以常數時間執行。
範例
// 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
}