我有一些代码列举了一些数据,如下所示:
int count;
InitDataEnumeration(/* some init params */, &count);
for (int i = 0; i < count; i++)
{
EnumGetData(i, &data);
// process data ...
}
我想以适合C ++ 11的范围 - 的形式转换此代码。
我在考虑定义一个DataEnumerator
包装类,其构造函数将调用上面的InitDataEnumeration()
函数。
这个想法是使用这个包装类:
DataEnumerator enumerator{/* init params*/};
for (const auto& data : enumerator)
{
// process data ...
}
前者int
- 索引for循环如何在后一种基于范围的形式中重构?
我在考虑从枚举器包装类中公开begin()
和end()
方法,但我不知道它们应该返回什么类型的迭代器,以及如何定义这样的迭代器。
请注意,迭代过程仅限前向。
答案 0 :(得分:2)
您正在寻找的是boost::irange
。它将在[first, last)
范围内构建一个惰性范围的整数,您可以像在for循环中使用i
一样直接放入。
for (int i = 0; i < count; i++)
{
EnumGetData(i, &data);
// process data ...
}
变为
for (auto i : boost::irange(0, count))
{
EnumGetData(i, &data);
// process data ...
}
答案 1 :(得分:1)
您需要一个输入迭代器,此示例完全从http://en.cppreference.com/w/cpp/iterator/iterator复制:
#include <iostream> #include <algorithm> template<long FROM, long TO> class Range { public: // member typedefs provided through inheriting from std::iterator class iterator: public std::iterator< std::input_iterator_tag, // iterator_category long, // value_type long, // difference_type const long*, // pointer long // reference >{ long num = FROM; public: explicit iterator(long _num = 0) : num(_num) {} iterator& operator++() {num = TO >= FROM ? num + 1: num - 1; return *this;} iterator operator++(int) {iterator retval = *this; ++(*this); return retval;} bool operator==(iterator other) const {return num == other.num;} bool operator!=(iterator other) const {return !(*this == other);} reference operator*() const {return num;} }; iterator begin() {return iterator(FROM);} iterator end() {return iterator(TO >= FROM? TO+1 : TO-1);} }; int main() { // std::find requires a input iterator auto range = Range<15, 25>(); auto itr = std::find(range.begin(), range.end(), 18); std::cout << *itr << '\n'; // 18 // Range::iterator also satisfies range-based for requirements for(long l : Range<3, 5>()) { std::cout << l << ' '; // 3 4 5 } std::cout << '\n'; }
答案 2 :(得分:0)
你对begin()
和end()
的看法是正确的,无论他们返回什么应该提供:
所有这些都是不言自明的。
请注意,不需要任何特征或类别,就像用于某些标准库算法的迭代器一样 - 只是最低限度。
答案 3 :(得分:-1)
for(auto x : y)
这里,y
必须是具有begin()
方法和end()
方法的类的对象,每个方法都返回一个实现迭代器概念的对象。迭代器必须是可递增的(iter++
),必须能够准确地确定它是否等于同类的另一个迭代器(通过!=
)并且必须取消引用任何x
}需要。
如果您感到无聊或者没有其他更好的事情或者B)有合法需要,那么您应该考虑这样做。虽然这不难做到,但也不是微不足道的。