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

从迭代器首尾构造O(1)时间切片容器,是否有标准库包装器?

回答

C++20及以后的标准库提供了std::ranges::subrange,完全符合你的需求——它可以把一对迭代器(包括前向迭代器)包装成一个满足范围概念的对象,天然支持begin()和end()方法,能直接传入需要容器式范围的函数。

修改你的示例代码如下:

#include <iostream>
#include <vector>
#include <ranges>

template <typename C>
void use_container(C c) {
  if (!c.empty()) {
    std::cout << *c.begin() << std::endl;
  }
}

int main() {
std::vector<int> v {1,2,3,4,5,5};
auto begin_ = v.begin();
auto end_ = begin_ + 5;
use_container(std::ranges::subrange(begin_, end_)); 
return 0;
}

如果你的编译器不支持C++20,标准库中没有现成的包装器,不过可以自己实现一个极简版本:

template <typename Iter>
struct IteratorRange {
    Iter begin_;
    Iter end_;

    Iter begin() const { return begin_; }
    Iter end() const { return end_; }
    bool empty() const { return begin_ == end_; }
    // 可选:仅当迭代器为随机访问迭代器时支持size()
    auto size() const requires std::random_access_iterator<Iter> {
        return end_ - begin_;
    }
};

// 辅助函数简化创建过程
template <typename Iter>
auto make_iterator_range(Iter begin, Iter end) {
    return IteratorRange<Iter>{begin, end};
}

使用时直接调用make_iterator_range(begin_, end_)传入use_container即可。

内容的提问来源于stack exchange,提问作者Nimrod Fiat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:55:32