std::ranges::in_out_result
来自cppreference.com
在标头 <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> |
(1) | |
template<class I2, class O2> requires std::convertible_to<I, I2> && std::convertible_to<O, O2> |
(2) | |
通过从 *this 的每个数据成员构造结果的对应成员,转换 *this 为结果。
1) 等价于 return {in, out}; 。
2) 等价于 return {std::move(in), std::move(out)}; 。
标准库
下列标准库函数以 ranges::in_out_result
为返回类型:
算法函数 | |
(C++20)(C++20) |
将某一范围的元素复制到一个新的位置 (niebloid) |
(C++20) |
将一定数目的元素复制到一个新的位置 (niebloid) |
(C++20) |
按从后往前的顺序复制一个范围内的元素 (niebloid) |
(C++20) |
将某一范围的元素移动到一个新的位置 (niebloid) |
(C++20) |
按从后往前的顺序移动某一范围的元素到新的位置 (niebloid) |
(C++20) |
将一个函数应用于某一范围的各个元素 (niebloid) |
(C++20)(C++20) |
复制一个范围内的元素,并将满足特定判别标准的元素替换为另一个值 (niebloid) |
(C++20)(C++20) |
复制一个范围的元素,忽略满足特定判别标准的元素 (niebloid) |
(C++20) |
创建某范围的不含连续重复元素的副本 (niebloid) |
(C++20) |
创建一个范围的逆向副本 (niebloid) |
(C++20) |
复制并旋转元素范围 (niebloid) |
(C++20) |
对范围内的元素进行复制并部分排序 (niebloid) |
(C++20) |
计算两个集合的差集 (niebloid) |
未初始化内存函数 | |
(C++20) |
复制元素范围到未初始化的内存区域 (niebloid) |
(C++20) |
复制一定量元素到未初始化的内存区域 (niebloid) |
(C++20) |
移动对象范围到未初始化的内存区域 (niebloid) |
(C++20) |
移动一定量对象到未初始化的内存区域 (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::pair 和 std::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) |
实现固定大小的容器,它保有类型可以相异的元素 (类模板) |