std::ranges::in_in_out_result
|
在标头
<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> && |
(1) | |
|
template<class II1, class II2, class OO>
requires std::convertible_to<I1, II1> && |
(2) | |
通过从 *this 的每个数据成员构造结果的对应成员,转换 *this 为结果。
1) 等价于 return {in1, in2, out}; 。
2) 等价于 return {std::move(in1), std::move(in2), std::move(out)}; 。
标准库
下列标准库函数以 ranges::in_in_out_result 为返回类型:
算法函数 |
|
|
(C++20)
|
将一个函数应用于某一范围的各个元素 (niebloid) |
|
(C++20)
|
归并二个已排序范围 (niebloid) |
|
(C++20)
|
计算两个集合的并集 (niebloid) |
|
(C++20)
|
计算两个集合的交集 (niebloid) |
|
(C++20)
|
计算两个集合的对称差 (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::pair 与 std::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)
|
实现固定大小的容器,它保有类型可以相异的元素 (类模板) |