std::ranges::in_out_out_result
来自cppreference.com
| 定义于头文件 <algorithm>
|
||
| template <class I, class O1, class O2> struct in_out_out_result; |
(C++20 起) | |
ranges::in_out_out_result 是类模板,提供存储三个迭代器为单个单元的方式。
此类模板无基类或显示如下的声明的数据成员,从而它适合用于结果化绑定。
此类模板的所有特殊成员函数均为隐式声明,这使得特化为聚合类,并传播数据成员上的操作的平凡性、潜在抛出性及 constexpr 性质。
目录 |
[编辑] 模板形参
| I, O1, O2 | - | ranges::in_out_out_result 所存储的对象类型
|
[编辑] 数据成员
std::ranges::in_out_out_result::in
| [[no_unique_address]] I in; |
||
值(假定为迭代器)
std::ranges::in_out_out_result::out1
| [[no_unique_address]] O1 out1; |
||
值(假定为迭代器)
std::ranges::in_out_out_result::out2
| [[no_unique_address]] O2 out2; |
||
值(假定为迭代器)
[编辑] 成员函数
std::ranges::in_out_out_result::operator in_out_out_result<II, OO1, OO2>
| template<class II, class OO1, class OO2> requires std::convertible_to<const I&, II> && |
(1) | |
| template<class II, class OO1, class OO2> requires std::convertible_to<I, II> && |
(2) | |
通过从 *this 的每个数据成员构造结果的对应成员,转换 *this 为结果。
1) 等价于 return {in, out1, out2}; 。
2) 等价于 return {std::move(in), std::move(out1), std::move(out2)}; 。
[编辑] 标准库
下列标准库函数以 ranges::in_out_out_result 为返回类型:
算法函数 | |
| (C++20) |
复制一个范围,将各元素分为二组 (niebloid) |
[编辑] 概要
namespace std::ranges { template<class I, class O1, class O2> struct in_out_out_result { [[no_unique_address]] I in; [[no_unique_address]] O1 out1; [[no_unique_address]] O2 out2; template<class II, class OO1, class OO2> requires std::convertible_to<const I&, II> && std::convertible_to<const O1&, OO1> && std::convertible_to<const O2&, OO2> constexpr operator in_out_out_result<II, OO1, OO2>() const & { return {in, out1, out2}; } template<class II, class OO1, class OO2> requires std::convertible_to<I, II> && std::convertible_to<O1, OO1> && std::convertible_to<O2, OO2> constexpr operator in_out_out_result<II, OO1, OO2>() && { return {std::move(in), std::move(out1), std::move(out2)}; } }; }
[编辑] 注解
每个使用此返回类型族的标准库算法声明新的别名类型,例如 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 <cctype> #include <iostream> #include <iterator> #include <ranges> #include <string_view> void print(std::string_view rem, auto first, auto last) { for (std::cout << rem << ": { "; first != last; ++first) std::cout << *first << ' '; std::cout << "}\n"; } int main() { constexpr std::string_view in{"TvEeNcStOoRr"}; std::array<char, in.size()> o1, o2; const auto result = std::ranges::partition_copy(in, o1.begin(), o2.begin(), [](char c){ return std::isupper(c); }); print("in", in.begin(), result.in); print("o1", o1.begin(), result.out1); print("o2", o2.begin(), result.out2); }
输出:
in: { T v E e N c S t O o R r }
o1: { T E N S O R }
o2: { v e c t o r }[编辑] 参阅
| 实现二元组,即一对值 (类模板) | |
| (C++11) |
实现固定大小的容器,它保有类型可以相异的元素 (类模板) |