std::ranges::in_in_out_result

< cpp‎ | algorithm‎ | ranges
在标头 <algorithm> 定义
template <class I1, class I2, class O>
struct in_in_out_result;
(C++20 起)

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

此类模板无基类或显示如下的声明的数据成员,从而它适合用于结果化绑定

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

模板形参

I1, I2, O - ranges::in_in_out_result 所存储的迭代器类型

数据成员

std::ranges::in_in_out_result::in1

[[no_unique_address]] I1 in1;

值(假定为迭代器)

std::ranges::in_in_out_result::in2

[[no_unique_address]] I2 in2;

值(假定为迭代器)

std::ranges::in_in_out_result::out

[[no_unique_address]] O out;

值(假定为迭代器)

成员函数

std::ranges::in_in_out_result::operator in_in_out_result<II1, II2, OO>

template<class II1, class II2, class OO>

requires std::convertible_to<const I1&, II1> &&
         std::convertible_to<const I2&, II2> &&
         std::convertible_to<const O&, OO>

constexpr operator in_in_out_result<II1, II2, OO>() const &;
(1)
template<class II1, class II2, class OO>

requires std::convertible_to<I1, II1> &&
         std::convertible_to<I2, II2> &&
         std::convertible_to<O, OO>

constexpr operator in_in_out_result<II1, II2, OO>() &&;
(2)

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

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

标准库

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

算法函数
将一个函数应用于某一范围的各个元素
(niebloid)
(C++20)
归并二个已排序范围
(niebloid)
计算两个集合的并集
(niebloid)
计算两个集合的交集
(niebloid)
计算两个集合的对称差
(niebloid)

概要

namespace std::ranges {
    template<class I1, class I2, class O>
    struct in_in_out_result {
        [[no_unique_address]] I1 in1;
        [[no_unique_address]] I2 in2;
        [[no_unique_address]] O  out;
 
        template<class II1, class II2, class OO>
        requires std::convertible_to<const I1&, II1> &&
                 std::convertible_to<const I2&, II2> &&
                 std::convertible_to<const O&, OO>
        constexpr operator in_in_out_result<II1, II2, OO>() const & {
            return {in1, in2, out};
        }
 
        template<class II1, class II2, class OO>
        requires std::convertible_to<I1, II1> &&
                 std::convertible_to<I2, II2> &&
                 std::convertible_to<O, OO>
        constexpr operator in_in_out_result<II1, II2, OO>() && {
            return {std::move(in1), std::move(in2), 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 <iostream>
#include <iterator>
#include <ranges>
 
void print(auto rem, auto first, auto last) {
    for (std::cout << rem << ": "; first != last; ++first)
        std::cout << *first << ' ';
    std::cout << '\n';
}
 
int main()
{
    constexpr static auto in1 = {1, 2, 3, 4, 5, 5};
    constexpr static auto in2 = {3, 4, 5, 6, 7};
    std::array<int, std::size(in1) + std::size(in2)> out;
 
    const auto result = std::ranges::merge(in1, in2, out.begin());
    print("in1", in1.begin(), result.in1);
    print("in2", in2.begin(), result.in2);
    print("out", out.begin(), result.out);
}

输出:

in1: 1 2 3 4 5 5 
in2: 3 4 5 6 7 
out: 1 2 3 3 4 4 5 5 5 6 7

参阅

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