You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不调用std::ranges::subrange的前提下声明可后续赋值的range对象?

解决方案

要在循环外声明可存储std::ranges::equal_range结果的range对象,且不提前调用std::ranges::subrange初始化,最直接的方式是用decltype推导equal_range的返回类型,再默认初始化对象。

方法1:基于已有容器推导类型

利用已声明的容器实例,直接推导equal_range的返回类型:

#include <ranges>
#include <vector>
#include <algorithm> // std::ranges::equal_range需包含此头

int main()
{
    std::vector<int> values(10);

    // 推导equal_range的返回类型并默认初始化range
    decltype(std::ranges::equal_range(values, 0)) range;

    while (/* 你的循环条件 */) {
        range = std::ranges::equal_range(values, /* 目标查找值 */);
    }

    size_t last_range_size = range.size();
}

方法2:用std::declval通用推导

如果容器还未初始化,或需要更通用的写法,可结合std::declval推导类型:

#include <ranges>
#include <vector>
#include <algorithm>
#include <utility> // std::declval需包含此头

int main()
{
    std::vector<int> values(10);

    // 无需实际传入容器实例,直接推导类型
    decltype(std::ranges::equal_range(std::declval<std::vector<int>&>(), std::declval<int>())) range;

    while (/* 你的循环条件 */) {
        range = std::ranges::equal_range(values, /* 目标查找值 */);
    }

    size_t last_range_size = range.size();
}

关键说明

  • std::ranges::equal_range的返回类型本质是std::ranges::subrange的特化(针对容器的迭代器类型),用decltype能自动推导这个复杂的特化类型,避免手动书写出错。
  • 默认初始化的subrange内部迭代器处于未指定状态,但只要在赋值前不调用其成员函数(比如size()、begin()),就不会触发未定义行为,完全符合你的使用场景。

内容的提问来源于stack exchange,提问作者Damir Tenishev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:21:04