std::ranges::in_found_result

来自cppreference.com
< cpp‎ | algorithm‎ | ranges
 
 
受约束算法
不修改序列的操作
修改序列的操作
划分操作
排序操作
二分搜索操作
集合操作(在已排序范围上)
堆操作
最小/最大操作
排列
未初始化存储上的操作
返回类型
 
 
在标头 <algorithm> 定义
template <class I>
struct in_found_result;
(C++20 起)

ranges::in_found_result 是类模板,提供存储一个迭代器和一个布尔标志为单个单元的方式。

除了下面显示的成员外,此类模板没有其他基类或数据成员,从而它适用于结构化绑定

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

模板形参

I - ranges::in_found_result 所存储的迭代器类型

数据成员

std::ranges::in_found_result::in

[[no_unique_address]] I in;

值(假定为迭代器)

std::ranges::in_found_result::found

bool found;

布尔标志(可能显示是否找到对应的范围)

成员函数

std::ranges::in_found_result::operator in_found_result<I2>

template<class I2>

requires std::convertible_to<const I&, I2>

constexpr operator in_found_result<I2>() const &;
(1)
template<class I2>

requires std::convertible_to<I, I2>

constexpr operator in_found_result<I2>() &&;
(2)

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

1) 等价于 return {in, found};
2) 等价于 return {std::move(in), found};

标准库

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

算法函数
产生某个元素范围的按字典序下一个较大的排列
(niebloid)
产生某个元素范围的按字典序下一个较小的排列
(niebloid)

概要

namespace std::ranges {
    template<class I>
    struct in_found_result {
        [[no_unique_address]] I in;
        bool found;
 
        template<class I2>
        requires std::convertible_to<const I&, I2>
        constexpr operator in_found_result<I2>() const & {
            return {in, found};
        }
 
        template<class I2>
        requires std::convertible_to<I, I2>
        constexpr operator in_found_result<I2>() && {
            return {std::move(in), found};
        }
    };
}

注解

每个使用此返回类型族的标准库算法都声明了新的别名类型,例如 using merge_result = in_in_out_result<I1, I2, O>;

这些别名族的名称由算法名添加 “_result”组成。故 std::ranges::merge 的返回类型命名为 std::ranges::merge_result

不同于 std::pairstd::tuple,此类模板的拥有名字有意义的数据成员。

示例

#include <algorithm>
#include <iostream>
#include <iterator>
#include <ranges>
 
int main()
{
    int v[] { 1, 2, 3 };
 
    const auto result = std::ranges::next_permutation(v);
 
    std::ranges::for_each(std::cbegin(v), result.in, [](int e){std::cout << e << ' ';});
 
    std::cout << std::boolalpha << "\n" "result.found: " << result.found << '\n';
}

输出:

1 3 2 
result.found = true

参阅

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