std::ranges::destroy_n

来自cppreference.com
 
 
算法库
受约束算法及范围上的算法 (C++20)
包含算法例如 ranges::copyranges::sort、...
排序和相关操作
划分操作
(C++11)    

排序操作
二分搜索操作(在已划分范围上)
集合操作(在有序范围上)
归并操作(在有序范围上)
堆操作
最小/最大操作
(C++11)
(C++17)
字典序比较操作
排列操作




 
 
在标头 <memory> 定义
调用签名
template< /*nothrow-input-iterator*/ I >
    requires std::destructible<std::iter_value_t<I>>
constexpr I destroy_n( I first, std::iter_difference_t<I> count ) noexcept;
(1) (C++20 起)
template< /*execution-policy*/ Ep, /*nothrow-random-access-iterator*/ I >
    requires std::destructible<std::iter_value_t<I>>
I destroy_n( Ep&& policy, I first, std::iter_difference_t<I> count );
(2) (C++26 起)

/*execution-policy*/ 的定义见此页;其他仅用于阐述的概念的定义见此页

1) 如同用以下方式销毁目标范围 first + [0count) 中的元素:
return std::ranges::destroy(std::counted_iterator(first, count),
                            std::default_sentinel).base();
2)(1),但按照 policy 执行。

此页面上描述的函数式实体是算法函数对象(非正式地称为 niebloid),即:

参数

first - 要销毁的元素范围的起始
count - 要销毁的元素数
policy - 所用的执行策略

返回值

如上所述。

异常

2) 在执行过程中:
  • 如果并行化所需的临时内存资源不可用,那么就会抛出 std::bad_alloc
  • 如果在通过算法实参访问对象时抛出了未捕获的异常,那么行为由执行策略决定(标准策略会调用 std::terminate)。

注解

功能特性测试 标准 功能特性
__cpp_lib_parallel_algorithm 202506L (C++26) 并行范围算法

可能的实现

struct destroy_n_fn
{
    template</*nothrow-input-iterator*/ I>
        requires std::destructible<std::iter_value_t<I>>
    constexpr I operator()(I first, std::iter_difference_t<I> n) const noexcept
    {
        for (; n != 0; (void)++first, --n)
            std::ranges::destroy_at(std::addressof(*first));
        return first;
    }
};

inline constexpr destroy_n_fn destroy_n{};

示例

下列示例演示如何用 ranges::destroy_n 销毁元素的相接序列。

#include <iostream>
#include <memory>
#include <new>

struct Tracer
{
    int value;
    ~Tracer() { std::cout << value << " 已析构\n"; }
};

int main()
{
    alignas(Tracer) unsigned char buffer[sizeof(Tracer) * 8];
    
    for (int i = 0; i < 8; ++i)
        new(buffer + sizeof(Tracer) * i) Tracer{i}; // 手工构造对象

    auto ptr = std::launder(reinterpret_cast<Tracer*>(buffer));

    std::ranges::destroy_n(ptr, 8);
}

输出:

0 已析构
1 已析构
2 已析构
3 已析构
4 已析构
5 已析构
6 已析构
7 已析构

参阅

销毁给定地址的对象
(算法函数对象) [编辑]
销毁范围中的对象
(算法函数对象) [编辑]
(C++17)
销毁范围中若干对象
(函数模板) [编辑]
Morty Proxy This is a proxified and sanitized view of the page, visit original site.