<ranges>
함수
<ranges>
C++20 헤더에는 다음과 같은 비회원 도우미 함수가 포함됩니다.
비 멤버 함수 | 설명 |
---|---|
begin C++20 |
범위의 첫 번째 요소에 대한 반복기를 가져옵니다. |
cbegin C++20 |
범위의 const 첫 번째 요소에 대한 반복기를 가져옵니다. |
cend C++20 |
정규화된 범위의 끝에 있는 sentinel을 const 가져옵니다. |
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 |
범위의 크기를 서명된 값으로 가져옵니다. |
이러한 '함수'의 대부분은 사용자 지정 지점 개체로 구현됩니다. 사용자 지정 지점 개체는 사용자 정의 형식에서 오버로드할 수 있는 함수 개체이며 함수 개체 에 전달할 수 있는 형식 종류에 대한 제약 조건도 적용합니다. 결과적으로 컴파일러는 전달된 형식을 호출할 유효한 사용자 지정 함수가 있는지 또는 기본 구현을 사용해야 하는지 또는 호출 형식이 잘못된지 파악합니다.
이러한 함수의 대부분은 네임스페이스에 해당 함수를 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
정규화된 범위의 끝에 있는 sentinel을 const
가져옵니다.
반복기는 범위의 요소에 액세스할 수 있지만 수정할 수는 없습니다.
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
범위입니다.
반환 값
범위에 요소가 없으면 반환하고, 그렇지 않으면 false
반환 true
합니다.
예시
// 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
}