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