我发现自己刚刚写了这篇文章:
template <long int T_begin, long int T_end>
class range_class {
public:
class iterator {
friend class range_class;
public:
long int operator *() const { return i_; }
const iterator &operator ++() { ++i_; return *this; }
iterator operator ++(int) { iterator copy(*this); ++i_; return copy; }
bool operator ==(const iterator &other) const { return i_ == other.i_; }
bool operator !=(const iterator &other) const { return i_ != other.i_; }
protected:
iterator(long int start) : i_ (start) { }
private:
unsigned long i_;
};
iterator begin() const { return iterator(T_begin); }
iterator end() const { return iterator(T_end); }
};
template <long int T_begin, long int T_end>
const range_class<T_begin, T_end>
range()
{
return range_class<T_begin, T_end>();
}
这允许我写这样的东西:
for (auto i: range<0, 10>()) {
// stuff with i
}
现在,我知道我写的可能不是最好的代码 . 也许有一种方法可以使它更灵活和有用 . 但在我看来,像这样的东西应该成为标准的一部分 .
它也是吗?是否在一系列整数上为迭代器添加了某种新库,或者可能是通用范围的计算标量值?
8 回答
C标准库没有一个,但Boost.Range has boost::counting_range,当然有资格 . 您也可以使用boost::irange,它在范围上更有针对性 .
C 20的范围库允许您通过
view::iota(start, end)
执行此操作 .据我所知,C 11中没有这样的课程 .
无论如何,我试图改进你的实现 . 我把它设为非模板,因为我认为制作模板没有任何优势 . 相反,它有一个主要缺点:您无法在运行时创建范围,因为您需要在编译时知道模板参数 .
这是代码:
测试代码:
输出:
10 11 12 13 14 15 16 17 18 19
Onine demo .
为了完全相同的目的,我编写了一个名为
range
的库,除了它是一个运行时范围,我的案例中的想法来自Python . 我认为是一个编译时版本,但在我看来,获得编译时版本并没有什么好处 . 您可以在bitbucket上找到该库,它位于Boost License: Range 下 . 它是一个单头库,与C 03兼容,在C 11中具有基于范围的for循环的魅力 .Features :
一个真正的随机访问容器,包含所有的铃声和口哨声!
范围可以按字典顺序进行比较 .
两个函数
exist
(返回bool)和find
(返回迭代器)以检查是否存在数字 .使用CATCH对库进行单元测试 .
基本用法示例,使用标准容器,使用标准算法并使用基于范围的for循环 .
Here is a one-minute introduction . 最后,我欢迎任何有关这个小型图书馆的建议 .
我发现
boost::irange
比规范整数循环要慢得多 . 所以我使用预处理器宏来解决以下更简单的解决方案:然后你可以像这样循环:
该范围自动从零开始 . 它可以很容易地扩展到从给定数字开始 .
这是一个更简单的形式,对我来说很好用 . 我的方法有风险吗?
r_iterator
是一种尽可能像long int
一样的行为 . 因此,许多运算符如==
和++
,只是传递给long int
. 我'expose'通过operator long int
和operator long int &
转换的底层long int .( Edit: - 我们可以使用
range
static而不是const的方法 . )这可能有点晚了,但我刚看到这个问题,我现在已经使用这个课了一段时间了:
用法:
你试过用吗?
大部分时间都符合要求 .
例如 .
请注意,printInt可以用C 0x中的lambda替换OFC . 此用法的另一个小变化可能是(严格来说,对于random_iterator)
对于Fwd只有迭代器
您可以使用std :: iota()在C 11中轻松生成递增序列: