다음을 통해 공유


<ranges> 함수

<ranges>C++20 헤더에는 다음과 같은 비회원 도우미 함수가 포함됩니다.

비 멤버 함수 설명
beginC++20 범위의 첫 번째 요소에 대한 반복기를 가져옵니다.
cbeginC++20 범위의 const 첫 번째 요소에 대한 반복기를 가져옵니다.
cendC++20 정규화된 범위의 끝에 있는 sentinel을 const가져옵니다.
cdataC++20 const 연속 범위의 첫 번째 요소에 대한 포인터를 가져옵니다.
crbeginC++20 범위의 시작 부분에 역방향 const 반복기를 가져옵니다.
crendC++20 반환되는 항목의 crbegin() 끝에 있는 sentinel을 가져옵니다.
dataC++20 연속 범위의 첫 번째 요소에 대한 포인터를 가져옵니다.
emptyC++20 범위가 비어 있는지 테스트합니다.
endC++20 범위의 끝에 있는 sentinel을 가져옵니다.
rbeginC++20 범위의 시작 부분에 역방향 반복기를 가져옵니다.
rendC++20 범위의 끝에 있는 sentinel에 역방향 반복기를 가져옵니다.
sizeC++20 범위의 크기를 부호 없는 값으로 가져옵니다.
ssizeC++20 범위의 크기를 서명된 값으로 가져옵니다.

이러한 '함수'의 대부분은 사용자 지정 지점 개체구현됩니다. 사용자 지정 지점 개체는 사용자 정의 형식에서 오버로드할 수 있는 함수 개체이며 함수 개체 에 전달할 수 있는 형식 종류에 대한 제약 조건도 적용합니다. 결과적으로 컴파일러는 전달된 형식을 호출할 유효한 사용자 지정 함수가 있는지 또는 기본 구현을 사용해야 하는지 또는 호출 형식이 잘못된지 파악합니다.

이러한 함수의 대부분은 네임스페이스에 해당 함수를 std 가지고 있습니다. 그러나 범위를 사용할 때는 이러한 도우미 함수를 대신 사용합니다. 이러한 함수는 더 나은 컴파일 시간 오류를 제공하는 C++20 개념을 사용합니다. 사용자 지정 지점으로 구현되므로 ADL(인수 종속 조회) 및 const 정확성과 관련된 문제는 방지됩니다.

begin

범위의 첫 번째 요소에 대한 반복기를 가져옵니다.

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

매개 변수

T
범위의 형식입니다.

rg
범위입니다.

반환 값

범위의 첫 번째 요소에 대한 반복기입니다.

요소가 10, 20 및 30인 벡터 그림입니다. 첫 번째 요소는 10을 포함하며 'begin()'이라는 레이블이 지정됩니다. 마지막 요소는 30을 포함하며 '마지막 요소'라는 레이블이 지정됩니다. 마지막 요소 뒤의 허수 상자는 sentinel을 나타내며 end()라는 레이블이 지정됩니다.

범위가 배열인 경우 해당 값을 반환합니다 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 범위의 첫 번째 요소에 대한 반복기입니다.

요소가 10, 20 및 30인 벡터 그림입니다. 첫 번째 요소는 10을 포함하며 'cbegin()'이라는 레이블이 지정됩니다. 마지막 요소는 30을 포함하며 '마지막 요소'라는 레이블이 지정됩니다. 마지막 요소 뒤의 가상 상자는 sentinel을 나타내며 cend()라는 레이블이 지정됩니다.

범위가 배열인 경우 해당 값을 반환합니다 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입니다.

요소가 10, 20 및 30인 벡터 그림입니다. 첫 번째 요소는 10을 포함하며 cbegin()이라는 레이블이 지정됩니다. 마지막 요소는 30을 포함하며 '마지막 요소'라는 레이블이 지정됩니다. 마지막 요소 뒤의 가상 상자는 sentinel을 나타내며 cend()라는 레이블이 지정됩니다.

설명

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 반복기입니다. 이 반복기는 범위의 끝에서 시작하여 범위의 요소를 역순으로 반환합니다.

요소 10, 20 및 30을 포함하는 벡터 그림입니다. 가장 왼쪽 요소 앞에는 센티넬을 나타내는 가상 상자가 있습니다(맨 왼쪽 요소에 숫자 10 포함). 레이블이 crend()인 경우 벡터의 첫 번째 요소는 숫자 10을 포함하며 '마지막 요소'라는 레이블이 지정됩니다. 벡터의 맨 오른쪽 요소는 30을 포함하며 crbegin()이라는 레이블이 지정됩니다.

범위가 배열인 경우 배열의 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은 범위의 역방향 보기에서 마지막 요소를 따릅니다.

요소 10, 20 및 30을 포함하는 벡터 그림입니다. 가장 왼쪽 요소 앞에는 센티넬을 나타내는 가상 상자가 있습니다(맨 왼쪽 요소에 숫자 10 포함). 레이블이 crend()인 경우 벡터의 첫 번째 요소는 숫자 10을 포함하며 '마지막 요소'라는 레이블이 지정됩니다. 벡터의 맨 오른쪽 요소는 30을 포함하며 crbegin()이라는 레이블이 지정됩니다.

설명

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입니다.

요소가 10, 20 및 30인 벡터 그림입니다. 첫 번째 요소는 10을 포함하며 begin()이라는 레이블이 지정됩니다. 마지막 요소는 30을 포함하며 '마지막 요소'라는 레이블이 지정됩니다. 마지막 요소 뒤의 허수 상자는 sentinel을 나타내며 end()라는 레이블이 지정됩니다.

설명

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
범위입니다.

반환 값

범위의 첫 번째 요소에 대한 역방향 반복기입니다. 이 반복기는 역방향 범위의 끝에서 시작하여 범위의 요소를 역순으로 반환합니다.

요소 10, 20 및 30을 포함하는 벡터 그림입니다. 가장 왼쪽 요소 앞에는 센티넬을 나타내는 가상 상자가 있습니다(맨 왼쪽 요소에 숫자 10 포함). 레이블이 rend()입니다. 벡터의 첫 번째 요소는 숫자 10을 포함하며 '마지막 요소'라는 레이블이 지정됩니다. 벡터의 맨 오른쪽 요소는 30을 포함하며 rbegin()이라는 레이블이 지정됩니다.

범위가 배열인 경우 배열의 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은 범위의 역방향 보기에서 마지막 요소를 따릅니다.

요소 10, 20 및 30을 포함하는 벡터 그림입니다. 가장 왼쪽 요소 앞에는 센티넬을 나타내는 가상 상자가 있습니다(맨 왼쪽 요소에 숫자 10 포함). 레이블이 rend()입니다. 벡터의 첫 번째 요소는 숫자 10을 포함하며 '마지막 요소'라는 레이블이 지정됩니다. 벡터의 맨 오른쪽 요소는 30을 포함하며 rbegin()이라는 레이블이 지정됩니다.

설명

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
}

참고 항목

<ranges>
사용자 지정 개체란?