从迭代器首尾构造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
相关产品推荐
相关产品推荐

