std::ranges::uninitialized_fill
cppreference.net에서 가져옴
| 헤더 <memory>
|
||
| 에 정의됨 |
||
template< /*nothrow-forward-iterator*/ I, /*nothrow-sentinel-for*/<I> S,
class T >
requires std::constructible_from<std::iter_value_t<I>, const T&>
I uninitialized_fill( I first, S last, const T& value );
|
호출 서명 | (1) (C++20 이후) |
template< /*nothrow-forward-range*/ R, class T >
requires std::constructible_from<ranges::range_value_t<R>, const T&>
ranges::borrowed_iterator_t<R> uninitialized_fill( R&& r,
const T& value );
|
(constexpr since C++26) | (2) (C++20 이후) |
template< /*execution-policy*/ Ep, /*nothrow-random-access-iterator*/ I,
/*nothrow-sized-sentinel-for*/<I> S,
class T = std::iter_value_t<I> >
requires constructible_from<std::iter_value_t<I>, const T&>
I uninitialized_fill( Ep&& policy, I first, S last, const T& value );
|
(constexpr since C++26) | (3) |
template< /*execution-policy*/ Ep, /*nothrow-sized-random-access-range*/ R,
class T = ranges::range_value_t<R> >
requires std::constructible_from<ranges::range_value_t<R>, const T&>
ranges::borrowed_iterator_t<R> uninitialized_fill( Ep&& policy, R&& r,
const T& value );
|
(C++26 이후) | (4) |
(C++26 이후)/*execution-policy*/의 정의는 이 페이지를 참조하십시오; 다른 설명 전용 개념의 정의는 이 페이지를 참조하십시오.
1) 주어진 값
[first, last)을 사용하여 대상 범위 value에 요소들을 다음과 같이 생성합니다.
for (; first != last; ++first)
::new (voidify(*first)) std::remove_reference_t<std::iter_reference_t<I>>(value);
return first;
초기화 중 예외가 발생하면 이미 생성된 객체들은 지정되지 않은 순서로 소멸됩니다.
2) (1)과 동일하지만, 을 대상 범위로 사용합니다.
r3,4) (1,2)와 동일하지만, 에 따라 실행됩니다.
policy이 페이지에 설명된 함수형 엔티티는 알고리즘 함수 객체 (비공식적으로 niebloids)로, 즉:
- 이들 중 하나를 호출할 때 명시적 템플릿 인자 목록을 지정할 수 없습니다.
- 이들 중 어느 것도 인자 종속 검색에 보이지 않습니다.
- 이들 중 하나가 일반적인 비한정 검색에 의해 함수 호출 연산자 왼쪽의 이름으로 발견되면, 인자 종속 검색이 억제됩니다.
매개변수
| first, last | - | 초기화할 범위의 요소들을 정의하는 반복자-센티널 쌍 |
| r | - | 초기화할 요소들의 범위 |
| value | - | 요소를 생성할 값 |
| policy | - | 사용할 실행 정책 |
반환값
위에서 설명한 대로입니다.
예외
대상 범위의 요소를 생성하는 동안 발생한 모든 예외.
3,4) 실행 과정:
- 병렬화에 필요한 임시 메모리 자원을 사용할 수 없는 경우 std::bad_alloc이 발생합니다.
- 알고리즘 인수를 통해 객체에 접근하는 동안 포착되지 않은 예외가 발생하면, 실행 정책에 따라 동작이 결정됩니다(표준 정책의 경우 std::terminate이 호출됩니다).
참고
구현은 출력 범위의 값 유형이 ranges::uninitialized_fill (예: ranges::fill 사용)인 경우 TrivialType의 효율성을 향상시킬 수 있습니다.
| 기능-테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_parallel_algorithm |
202506L |
(C++26) | 병렬 범위 알고리즘 |
__cpp_lib_raw_memory_algorithms |
202411L |
(C++26) | constexpr 특수화된 <memory> 알고리즘의 경우, (1,2)
|
가능한 구현
struct uninitialized_fill_fn
{
template</*nothrow-forward-iterator*/ I, /*nothrow-sentinel-for*/<I> S, class T>
requires std::constructible_from<std::iter_value_t<I>, const T&>
constexpr I operator()(I first, S last, const T& value) const
{
I rollback{first};
try
{
for (; !(first == last); ++first)
ranges::construct_at(std::addressof(*first), value);
return first;
}
catch (...)
{
// rollback: destroy constructed elements
for (; rollback != first; ++rollback)
ranges::destroy_at(std::addressof(*rollback));
throw;
}
}
template</*nothrow-forward-range*/ R, class T>
requires std::constructible_from<ranges::range_value_t<R>, const T&>
constexpr ranges::borrowed_iterator_t<R> operator()(R&& r, const T& value) const
{
return (*this)(ranges::begin(r),
ranges::next(ranges::begin(r), ranges::end(r)), value);
}
};
inline constexpr uninitialized_fill_fn uninitialized_fill{};
|
예제
이 코드 실행
#include <iostream> #include <memory> #include <string> int main() { constexpr int n{4}; alignas(alignof(std::string)) char out[n * sizeof(std::string)]; try { auto first{reinterpret_cast<std::string*>(out)}; auto last{first + n}; std::ranges::uninitialized_fill(first, last, "▄▀▄▀▄▀▄▀"); int count{1}; for (auto it{first}; it != last; ++it) std::cout << count++ << ' ' << *it << '\n'; std::ranges::destroy(first, last); } catch(...) { std::cout << "Exception!\n"; } }
출력:
1 ▄▀▄▀▄▀▄▀ 2 ▄▀▄▀▄▀▄▀ 3 ▄▀▄▀▄▀▄▀ 4 ▄▀▄▀▄▀▄▀
참고 항목
(C++20) |
객체를 시작점과 개수로 정의된 초기화되지 않은 메모리 영역에 복사합니다 (알고리즘 함수 객체) |
| 객체를 범위로 정의된 초기화되지 않은 메모리 영역에 복사합니다 (함수 템플릿) |