C++中如何用STL标准方式返回函数的迭代器范围?
C++标准库中返回迭代器范围的简便方案
针对你提出的需求,C++标准库提供了几种内置方案,无需自定义结构体:
1. C++20及以上:std::ranges::subrange
这是标准库专门为包装迭代器对设计的类型,完全符合你"纯迭代器、不计算大小"的要求,属于std::ranges组件,是STL的一部分。
示例声明:
#include <ranges> #include <vector> std::ranges::subrange<std::vector<int>::const_iterator> findRange();
借助C++20的概念特性,还能写出更通用的声明,适配任意输入迭代器类型:
#include <ranges> auto findRange() -> std::ranges::subrange<std::input_iterator auto>;
subrange支持范围for循环、begin()/end()等标准范围操作,还会自动适配迭代器的类别(如随机访问、双向等),实用性拉满。
2. 兼容旧标准:类型别名简化std::pair
如果项目无法升级到C++20,最简便的方式是给冗长的pair类型定义别名,避免重复书写:
#include <vector> #include <utility> using IntVecConstIterRange = std::pair<std::vector<int>::const_iterator, std::vector<int>::const_iterator>; IntVecConstIterRange findRange();
这种方式兼容C++11及以上版本,无额外依赖,只是需要提前定义别名。
补充说明
std::span依赖连续内存空间,本质是指针+大小的包装,无法适配非连续容器(如std::list),因此不符合你"纯迭代器"的需求。std::views是用于生成视图的工具,并非存储迭代器对的类型,确实不适合作为返回值。
总结:C++20环境下优先用std::ranges::subrange;旧标准下用类型别名简化std::pair,这两种都是标准库内置的简便方案。
内容的提问来源于stack exchange,提问作者Damir Tenishev
相关产品推荐
相关产品推荐

