std::ranges::in_out_result

来自cppreference.com
< cpp‎ | algorithm‎ | ranges
 
 
受约束算法
不修改序列的操作
修改序列的操作
划分操作
排序操作
二分搜索操作
集合操作(在已排序范围上)
堆操作
最小/最大操作
排列
未初始化存储上的操作
返回类型
 
 
在标头 <algorithm> 定义
template <class I, class O>
struct in_out_result;
(C++20 起)

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

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

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

模板形参

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

数据成员

std::ranges::in_out_result::in

[[no_unique_address]] I in;

值(假定为迭代器)

std::ranges::in_out_result::out

[[no_unique_address]] O out;

值(假定为迭代器)

成员函数

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 为返回类型:

算法函数
将某一范围的元素复制到一个新的位置
(niebloid)
将一定数目的元素复制到一个新的位置
(niebloid)
按从后往前的顺序复制一个范围内的元素
(niebloid)
将某一范围的元素移动到一个新的位置
(niebloid)
按从后往前的顺序移动某一范围的元素到新的位置
(niebloid)
将一个函数应用于某一范围的各个元素
(niebloid)
复制一个范围内的元素,并将满足特定判别标准的元素替换为另一个值
(niebloid)
复制一个范围的元素,忽略满足特定判别标准的元素
(niebloid)
创建某范围的不含连续重复元素的副本
(niebloid)
创建一个范围的逆向副本
(niebloid)
复制并旋转元素范围
(niebloid)
对范围内的元素进行复制并部分排序
(niebloid)
计算两个集合的差集
(niebloid)
未初始化内存函数
复制元素范围到未初始化的内存区域
(niebloid)
复制一定量元素到未初始化的内存区域
(niebloid)
移动对象范围到未初始化的内存区域
(niebloid)
移动一定量对象到未初始化的内存区域
(niebloid)

概要

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)
实现固定大小的容器,它保有类型可以相异的元素
(类模板)