Constrained algorithms (since C++20)
C++20은
제약 조건이 지정된
대부분의 알고리즘을
std::ranges
네임스페이스에서 제공합니다. 이러한 알고리즘에서 범위는
반복자
-
센티넬
쌍 또는 단일
range
인수로 지정할 수 있으며, 프로젝션과 멤버 함수 포인터 호출 가능 객체가 지원됩니다. 또한 대부분의 알고리즘의
반환 타입
은 알고리즘 실행 중 계산된 모든 잠재적으로 유용한 정보를 반환하도록 변경되었습니다.
목차 |
알고리즘 함수 객체
알고리즘 함수 객체 (AFO), 비공식적으로 niebloid 로 알려진 것은 하나 이상의 오버로드된 함수 템플릿으로 지정된 customization point object (CPO)입니다. 이러한 함수 템플릿의 이름은 해당 알고리즘 함수 객체를 지정합니다.
알고리즘 함수 객체
o
에 대해, 해당 함수 템플릿들의 집합을
S
라 하자. 그러면 임의의 인수 시퀀스
args...
에 대해,
o
(
args...
)
는
표현식 동등
하게
s
(
args...
)
이며, 여기서
s
에 대한 이름 탐색의 결과는 오버로드 집합
S
이다.
std::ranges
네임스페이스의 제약 알고리즘들은 알고리즘 함수 객체로 정의됩니다. 결과적으로:
- 명시적 템플릿 인수 목록은 이들 중 어느 것을 호출할 때도 지정할 수 없습니다.
- 이들 중 어느 것도 인수 종속 lookup 에 보이지 않습니다.
- 이들 중 어느 것이 함수 호출 연산자의 왼쪽 이름으로 일반 비한정 lookup 에 의해 발견될 때, 인수 종속 lookup 이 억제됩니다.
제약 조건이 있는 알고리즘
|
헤더 파일에 정의됨
<algorithm>
|
|
|
네임스페이스
std::ranges
에 정의됨
|
|
비수정 시퀀스 연산 |
|
|
(C++20)
(C++20)
(C++20)
|
범위 내 모든 요소, 일부 요소, 또는 어떤 요소에 대해서도 조건자가
true
인지 확인합니다
(알고리즘 함수 객체) |
|
(C++20)
|
단항
함수 객체
를
범위
의 요소들에 적용
(알고리즘 함수 객체) |
|
(C++20)
|
함수 객체를 시퀀스의 첫 N개 요소에 적용
(알고리즘 함수 객체) |
|
(C++20)
(C++20)
|
특정 조건을 만족하는 요소의 개수를 반환합니다
(알고리즘 함수 객체) |
|
(C++20)
|
두 범위가 처음으로 다른 위치를 찾음
(알고리즘 함수 객체) |
|
(C++20)
|
두 요소 집합이 동일한지 판별합니다
(알고리즘 함수 객체) |
|
(C++20)
|
한 범위가 다른 범위보다 사전순으로 작으면
true
를 반환함
(알고리즘 함수 객체) |
|
(C++20)
(C++20)
(C++20)
|
특정 조건을 만족하는 첫 번째 요소를 찾습니다
(알고리즘 함수 객체) |
|
(C++23)
(C++23)
(C++23)
|
특정 조건을 만족하는 마지막 요소를 찾습니다
(알고리즘 함수 객체) |
|
(C++20)
|
특정 범위에서 마지막 요소 시퀀스를 찾음
(알고리즘 함수 객체) |
|
(C++20)
|
요소 집합 중 하나를 검색합니다
(알고리즘 함수 객체) |
|
(C++20)
|
동일한(또는 주어진 조건자를 만족하는) 첫 번째 인접한 두 항목을 찾음
(알고리즘 함수 객체) |
|
(C++20)
|
요소 범위의 첫 번째 발생을 검색합니다
(알고리즘 함수 객체) |
|
(C++20)
|
범위에서 특정 요소가 연속적으로 지정된 횟수만큼 나타나는 첫 번째 위치를 검색합니다
(알고리즘 함수 객체) |
|
(C++23)
(C++23)
|
범위가 주어진 요소나 부분 범위를 포함하는지 확인합니다
(알고리즘 함수 객체) |
|
(C++23)
|
범위가 다른 범위로 시작하는지 확인합니다
(알고리즘 함수 객체) |
|
(C++23)
|
범위가 다른 범위로 끝나는지 확인합니다
(알고리즘 함수 객체) |
시퀀스 수정 연산 |
|
|
(C++20)
(C++20)
|
요소 범위를 새로운 위치로 복사합니다
(알고리즘 함수 객체) |
|
(C++20)
|
지정된 개수의 요소를 새로운 위치로 복사합니다
(알고리즘 함수 객체) |
|
(C++20)
|
요소 범위를 역순으로 복사합니다
(알고리즘 함수 객체) |
|
(C++20)
|
요소 범위를 새로운 위치로 이동시킵니다
(알고리즘 함수 객체) |
|
(C++20)
|
요소 범위를 역순으로 새 위치로 이동합니다
(알고리즘 함수 객체) |
|
(C++20)
|
특정 범위의 요소들에 지정된 값을 할당합니다
(알고리즘 함수 객체) |
|
(C++20)
|
지정된 개수의 요소에 값을 할당합니다
(알고리즘 함수 객체) |
|
(C++20)
|
범위의 요소들에 함수를 적용합니다
(알고리즘 함수 객체) |
|
(C++20)
|
함수의 결과를 범위에 저장
(알고리즘 함수 객체) |
|
(C++20)
|
함수를 N번 적용한 결과를 저장함
(알고리즘 함수 객체) |
|
(C++20)
(C++20)
|
특정 조건을 만족하는 요소들을 제거함
(알고리즘 함수 객체) |
|
(C++20)
(C++20)
|
특정 조건을 만족하는 요소들을 생략하고 범위의 요소들을 복사합니다
(알고리즘 함수 객체) |
|
(C++20)
(C++20)
|
특정 조건을 만족하는 모든 값을 다른 값으로 대체함
(알고리즘 함수 객체) |
|
(C++20)
(C++20)
|
범위를 복사하며 특정 조건을 만족하는 요소를 다른 값으로 대체합니다
(알고리즘 함수 객체) |
|
(C++20)
|
두 범위의 요소들을 교환
(알고리즘 함수 객체) |
|
(C++20)
|
범위 내 요소들의 순서를 역순으로 변경
(알고리즘 함수 객체) |
|
(C++20)
|
역순으로 된 범위의 복사본을 생성함
(알고리즘 함수 객체) |
|
(C++20)
|
범위 내 요소들의 순서를 회전시킵니다
(알고리즘 함수 객체) |
|
(C++20)
|
요소 범위를 복사하고 회전시킵니다
(알고리즘 함수 객체) |
|
(C++20)
|
범위 내 요소들을 무작위로 재정렬함
(알고리즘 함수 객체) |
|
범위 내 요소들을 이동시킵니다
(알고리즘 함수 객체) |
|
|
(C++20)
|
시퀀스에서 N개의 임의 요소를 선택합니다
(알고리즘 함수 객체) |
|
(C++20)
|
범위에서 연속된 중복 요소를 제거함
(알고리즘 함수 객체) |
|
(C++20)
|
연속적인 중복을 포함하지 않는 일부 범위의 요소 사본을 생성합니다
(알고리즘 함수 객체) |
파티셔닝 연산 |
|
|
(C++20)
|
주어진 조건자에 의해 범위가 분할되었는지 확인합니다
(알고리즘 함수 객체) |
|
(C++20)
|
요소들의 범위를 두 그룹으로 분할합니다
(알고리즘 함수 객체) |
|
(C++20)
|
범위의 요소들을 두 그룹으로 나누어 복사합니다
(알고리즘 함수 객체) |
|
(C++20)
|
요소들을 상대적 순서를 유지하며 두 그룹으로 분할합니다
(알고리즘 함수 객체) |
|
(C++20)
|
분할된 범위의 분할 지점을 찾습니다
(알고리즘 함수 객체) |
정렬 연산 |
|
|
(C++20)
|
범위가 오름차순으로 정렬되었는지 확인합니다
(알고리즘 함수 객체) |
|
(C++20)
|
가장 큰 정렬된 하위 범위를 찾음
(알고리즘 함수 객체) |
|
(C++20)
|
범위를 오름차순으로 정렬합니다
(알고리즘 함수 객체) |
|
(C++20)
|
범위의 첫 N개 요소를 정렬합니다
(알고리즘 함수 객체) |
|
(C++20)
|
요소 범위를 복사하고 부분적으로 정렬합니다
(알고리즘 함수 객체) |
|
(C++20)
|
동일한 요소들 간의 순서를 유지하면서 범위의 요소들을 정렬합니다
(알고리즘 함수 객체) |
|
(C++20)
|
주어진 범위를 부분적으로 정렬하여 주어진 요소로 분할되도록 보장합니다
(알고리즘 함수 객체) |
이진 검색 연산 (정렬된 범위에서) |
|
|
(C++20)
|
주어진 값보다
작지 않은
첫 번째 요소에 대한 반복자를 반환합니다
(알고리즘 함수 객체) |
|
(C++20)
|
특정 값보다
큰
첫 번째 요소에 대한 반복자를 반환함
(알고리즘 함수 객체) |
|
(C++20)
|
부분적으로 정렬된 범위에서 요소가 존재하는지 확인합니다
(알고리즘 함수 객체) |
|
(C++20)
|
특정 키와 일치하는 요소들의 범위를 반환합니다
(알고리즘 함수 객체) |
집합 연산 (정렬된 범위에서) |
|
|
(C++20)
|
두 개의 정렬된 범위를 병합함
(알고리즘 함수 객체) |
|
(C++20)
|
두 개의 정렬된 범위를 제자리에서 병합합니다
(알고리즘 함수 객체) |
|
(C++20)
|
한 시퀀스가 다른 시퀀스의 부분 시퀀스인 경우
true
를 반환
(알고리즘 함수 객체) |
|
(C++20)
|
두 집합 간의 차집합을 계산합니다
(알고리즘 함수 객체) |
|
(C++20)
|
두 집합의 교집합을 계산함
(알고리즘 함수 객체) |
|
(C++20)
|
두 집합의 대칭차를 계산함
(알고리즘 함수 객체) |
|
(C++20)
|
두 집합의 합집합을 계산합니다
(알고리즘 함수 객체) |
힙 연산 |
|
|
(C++20)
|
주어진 범위가 최대 힙인지 검사합니다
(알고리즘 함수 객체) |
|
(C++20)
|
최대 힙인 가장 큰 부분 범위를 찾음
(알고리즘 함수 객체) |
|
(C++20)
|
요소 범위로부터 최대 힙을 생성함
(알고리즘 함수 객체) |
|
(C++20)
|
최대 힙에 요소를 추가함
(알고리즘 함수 객체) |
|
(C++20)
|
최대 힙에서 가장 큰 요소를 제거합니다
(알고리즘 함수 객체) |
|
(C++20)
|
최대 힙을 오름차순으로 정렬된 원소들의 범위로 변환합니다
(알고리즘 함수 객체) |
최소/최대 연산 |
|
|
(C++20)
|
주어진 값들 중 더 큰 값을 반환합니다
(알고리즘 함수 객체) |
|
(C++20)
|
범위에서 가장 큰 요소를 반환합니다
(알고리즘 함수 객체) |
|
(C++20)
|
주어진 값들 중 더 작은 값을 반환합니다
(알고리즘 함수 객체) |
|
(C++20)
|
범위에서 가장 작은 요소를 반환합니다
(알고리즘 함수 객체) |
|
(C++20)
|
두 요소 중 더 작은 값과 더 큰 값을 반환합니다
(알고리즘 함수 객체) |
|
(C++20)
|
범위에서 가장 작은 요소와 가장 큰 요소를 반환합니다
(알고리즘 함수 객체) |
|
(C++20)
|
값을 한 쌍의 경계값 사이로 고정합니다
(알고리즘 함수 객체) |
순열 연산 |
|
|
(C++20)
|
시퀀스가 다른 시퀀스의 순열인지 판단합니다
(알고리즘 함수 객체) |
|
(C++20)
|
요소 범위의 다음으로 큰 사전식 순열을 생성합니다
(알고리즘 함수 객체) |
|
(C++20)
|
요소 범위의 다음으로 작은 사전식 순열을 생성합니다
(알고리즘 함수 객체) |
제약된 수치 연산
|
헤더 파일에 정의됨
<numeric>
|
|
|
네임스페이스에 정의됨
std::ranges
|
|
|
(C++23)
|
범위를 시작 값의 연속적인 증가값으로 채움
(알고리즘 함수 객체) |
제한된 폴드 연산
|
헤더에 정의됨
<algorithm>
|
|
|
네임스페이스에 정의됨
std::ranges
|
|
|
(C++23)
|
요소 범위를 왼쪽으로 폴드
(알고리즘 함수 객체) |
|
(C++23)
|
첫 번째 요소를 초기값으로 사용하여 요소 범위를 왼쪽으로 폴드
(알고리즘 함수 객체) |
|
(C++23)
|
요소 범위를 오른쪽으로 폴드
(알고리즘 함수 객체) |
|
(C++23)
|
마지막 요소를 초기값으로 사용하여 요소 범위를 오른쪽으로 폴드
(알고리즘 함수 객체) |
|
(C++23)
|
요소 범위를 왼쪽으로 폴드하고
pair
(반복자, 값)을 반환
(알고리즘 함수 객체) |
|
첫 번째 요소를 초기값으로 사용하여 요소 범위를 왼쪽으로 폴드하고
pair
(반복자,
optional
)을 반환
(알고리즘 함수 객체) |
|
제약된 초기화되지 않은 메모리 알고리즘
|
헤더 파일에 정의됨
<memory>
|
|
|
네임스페이스에 정의됨
std::ranges
|
|
|
(C++20)
|
객체 범위를 초기화되지 않은 메모리 영역에 복사합니다
(알고리즘 함수 객체) |
|
(C++20)
|
지정된 개수의 객체를 초기화되지 않은 메모리 영역에 복사합니다
(알고리즘 함수 객체) |
|
(C++20)
|
객체를 범위로 정의된 초기화되지 않은 메모리 영역에 복사합니다
(알고리즘 함수 객체) |
|
(C++20)
|
객체를 시작점과 개수로 정의된 초기화되지 않은 메모리 영역에 복사합니다
(알고리즘 함수 객체) |
|
(C++20)
|
객체 범위를 초기화되지 않은 메모리 영역으로 이동합니다
(알고리즘 함수 객체) |
|
(C++20)
|
지정된 개수의 객체를 초기화되지 않은 메모리 영역으로 이동합니다
(알ゴ리즘 함수 객체) |
|
범위로 정의된 초기화되지 않은 메모리 영역에서
기본 초기화
를 통해 객체를 생성합니다
(알고리즘 함수 객체) |
|
|
시작점과 개수로 정의된 초기화되지 않은 메모리 영역에서
기본 초기화
를 통해 객체를 생성합니다
(알고리즘 함수 객체) |
|
|
범위로 정의된 초기화되지 않은 메모리 영역에서
값 초기화
를 통해 객체를 생성합니다
(알고리즘 함수 객체) |
|
|
시작점과 개수로 정의된 초기화되지 않은 메모리 영역에서
값 초기화
를 통해 객체를 생성합니다
(알고리즘 함수 객체) |
|
|
(C++20)
|
객체 범위를 파괴합니다
(알고리즘 함수 객체) |
|
(C++20)
|
범위 내 지정된 개수의 객체를 파괴합니다
(알고리즘 함수 객체) |
|
(C++20)
|
지정된 주소의 객체를 파괴합니다
(알고리즘 함수 객체) |
|
(C++20)
|
지정된 주소에 객체를 생성합니다
(알고리즘 함수 객체) |
제약된 난수 알고리즘
|
헤더 파일에 정의됨
<random>
|
|
|
네임스페이스에 정의됨
std::ranges
|
|
|
(C++26)
|
범위를 균일 난수 비트 생성기로부터의 난수로 채움
(알고리즘 함수 객체) |
반환 타입
|
헤더에 정의됨
<algorithm>
|
|
|
네임스페이스에 정의됨
std::ranges
|
|
|
(C++20)
|
반복자와 함수 객체를 단일 단위로 저장하는 방법을 제공함
(클래스 템플릿) |
|
(C++20)
|
두 개의 반복자를 단일 단위로 저장하는 방법을 제공함
(클래스 템플릿) |
|
(C++20)
|
두 개의 반복자를 단일 단위로 저장하는 방법을 제공함
(클래스 템플릿) |
|
(C++20)
|
세 개의 반복자를 단일 단위로 저장하는 방법을 제공함
(클래스 템플릿) |
|
(C++20)
|
세 개의 반복자를 단일 단위로 저장하는 방법을 제공함
(클래스 템플릿) |
|
(C++20)
|
동일한 타입의 두 객체나 참조를 단일 단위로 저장하는 방법을 제공함
(클래스 템플릿) |
|
(C++20)
|
반복자와 불리언 플래그를 단일 단위로 저장하는 방법을 제공함
(클래스 템플릿) |
|
(C++23)
|
반복자와 값을 단일 단위로 저장하는 방법을 제공함
(클래스 템플릿) |
|
(C++23)
|
반복자와 값을 단일 단위로 저장하는 방법을 제공함
(클래스 템플릿) |
참고 사항
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type
|
202403L
|
(C++26) | 목록 초기화 for algorithms |
__cpp_lib_ranges
|
201911L
|
(C++20) | 범위 라이브러리 및 제약된 알고리즘 |
__cpp_lib_ranges_contains
|
202207L
|
(C++23) | std::ranges::contains |
__cpp_lib_ranges_find_last
|
202207L
|
(C++23) | std::ranges::find_last |
__cpp_lib_ranges_fold
|
202207L
|
(C++23) |
std::ranges
폴드 알고리즘
|
__cpp_lib_ranges_iota
|
202202L
|
(C++23) | std::ranges::iota |
__cpp_lib_ranges_starts_ends_with
|
202106L
|
(C++23) | std::ranges::starts_with , std::ranges::ends_with |
__cpp_lib_shift
|
201806L
|
(C++20) | std::shift_left , std::shift_right |
202202L
|
(C++23) | std::ranges::shift_left , std::ranges::shift_right | |
__cpp_lib_ranges_generate_random
|
202403L
|
(C++26) | std::ranges::generate_random |
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| P3136R1 | C++20 |
niebloids가 함수 객체 이외의 특수 엔티티로
명시되는 것이 허용됨 |
함수 객체로 명시되어야 함 |