std::ranges::in_out_result

来自cppreference.com
< cpp‎ | algorithm‎ | ranges
 
 
受约束算法
本菜单中的所有名字均属于命名空间 std::ranges
不修改序列的操作
修改序列的操作
划分操作
排序操作
二分搜索操作(在有序范围上)
       
       
集合操作(在有序范围上)
堆操作
最小/最大操作
       
       
排列操作
折叠操作
数值操作
(C++23)            
未初始化存储上的操作
返回类型
 
 
在标头 <algorithm> 定义
template< class I, class O >
struct in_out_result;
(C++20 起)

ranges::in_out_result 是类模板,提供存储二个迭代器为单个单元的方式。

除了下面显示的成员外,此类模板没有其他基类或数据成员,从而它适用于结构化绑定

此类模板的所有特殊成员函数均为隐式声明,这使得所有特化都为聚合类,并传播数据成员上相应的操作的平凡性、潜在抛出性及 constexpr 性质。

目录

[编辑] 模板形参

I, O - ranges::in_out_result 所存储的对象类型

[编辑] 数据成员

成员名字 定义
in
I 类型的值(假定为迭代器)。
(公开成员对象)
out
O 类型的值(假定为迭代器)。
(公开成员对象)

这些成员都被声明为带有 [[no_unique_address]] 属性。

[编辑] 成员函数

std::ranges::in_out_result::operator in_out_result<I2, O2>

template<class I2, class O2>

requires std::convertible_to<const I&, I2> && std::convertible_to<const O&, O2>

constexpr operator in_out_result<I2, O2>() const &;
(1)
template<class I2, class O2>

requires std::convertible_to<I, I2> && std::convertible_to<O, O2>

constexpr operator in_out_result<I2, O2>() &&;
(2)

通过从 *this 的每个数据成员构造结果的对应成员,转换 *this 为结果。

1) 等价于 return {in, out};
2) 等价于 return {std::move(in), std::move(out)};

[编辑] 标准库

下列标准库函数以 ranges::in_out_result 为返回类型:

算法函数
复制范围中元素到新位置
(算法函数对象) [编辑]
复制若干元素到新位置
(算法函数对象) [编辑]
从后往前复制范围中元素
(算法函数对象) [编辑]
将范围中元素移到新位置
(算法函数对象) [编辑]
从后往前将范围中元素移到新位置
(算法函数对象) [编辑]
应用函数到元素范围
(算法函数对象) [编辑]
复制范围,并将满足特定条件的元素替换为另一个值
(算法函数对象) [编辑]
复制范围并忽略满足特定条件的元素
(算法函数对象) [编辑]
创建某范围的不含连续重复元素的副本
(算法函数对象) [编辑]
创建范围的逆向副本
(算法函数对象) [编辑]
复制并旋转元素范围
(算法函数对象) [编辑]
复制范围中元素并部分排序
(算法函数对象) [编辑]
计算两个集合的差集
(算法函数对象) [编辑]
未初始化内存函数
复制范围中对象到未初始化内存
(算法函数对象) [编辑]
复制若干对象到未初始化内存
(算法函数对象) [编辑]
移动范围中对象到未初始化内存
(算法函数对象) [编辑]
移动若干对象到未初始化内存
(算法函数对象) [编辑]

[编辑] 概要

namespace std::ranges
{
    template<class I, class O>
    struct in_out_result
    {
        [[no_unique_address]] I in;
        [[no_unique_address]] O out;
 
        template<class I2, class O2>
        requires std::convertible_to<const I&, I2> && std::convertible_to<const O&, O2>
        constexpr operator in_out_result<I2, O2>() const &
        {
            return {in, out};
        }
 
        template<class I2, class O2>
        requires std::convertible_to<I, I2> && std::convertible_to<O, O2>
        constexpr operator in_out_result<I2, O2>() &&
        {
            return {std::move(in), std::move(out)};
        }
    };
}

[编辑] 注解

每个使用这一族返回类型的标准库算法都声明了新的别名类型,例如 using merge_result = in_in_out_result<I1, I2, O>;

这些别名的名称由算法名添加 “_result”组成。故 std::ranges::merge 的返回类型命名为 std::ranges::merge_result

不同于 std::pairstd::tuple,此类模板的拥有名字有意义的数据成员。

[编辑] 示例

#include <algorithm>
#include <array>
#include <cctype>
#include <iostream>
#include <ranges>
 
int main()
{
    constexpr char in[] = "transform" "\n";
    std::array<char, sizeof(in)> out;
 
    const auto result = std::ranges::transform(in, out.begin(),
        [](char c) { return std::toupper(c); });
 
    auto print = [](char c) { std::cout << c; };
    std::ranges::for_each(std::cbegin(in), result.in, print);
    std::ranges::for_each(out.cbegin(), result.out, print);
}

输出:

transform
TRANSFORM


[编辑] 参阅

实现二元组,即一对值
(类模板) [编辑]
(C++11)
实现固定大小的容器,可保有类型相异的元素
(类模板) [编辑]