C ++简单迭代器实现

时间:2012-02-16 20:28:33

标签: c++ iterator

我有像:

这样的数组
template<class T> class F
{
   ...
   bool isSet() { return set_; }
   T& GetVal() { return val_; }

private:
   T val_;
   bool set_; 
   ...
}

F<S1> arr1[10];

我正在寻找一个迭代器(或类似迭代器的类)来简化以下内容:

F<S1>* cur = arr1[0];
while(cur.IsSet())
{
   S1* ptr = cur->GetVal();
   // do something with ptr
   cur++;
};

想要更清洁的东西可以使用不同类型的S1,S2等。

3 个答案:

答案 0 :(得分:8)

该标准提供了数组的迭代器:

#include <iterator>

T arr[100];

for (auto it = std::begin(arr), end = std::end(arr); it != end; ++it)
{
    foo(*it);
    it->zap();
}

it的类型只是T *,但这会为您提供统一的界面。

术语“迭代器”实际上只是指概念而不是任何特定的代码。裸指针是完全合法的迭代器。重要的是std::iterator_traits给出了正确的typedef,它对裸指针有效。

答案 1 :(得分:3)

您可以使用Boost Iterator库创建自己的迭代器,尤其是iterator_facade

http://www.boost.org/doc/libs/1_49_0/libs/iterator/doc/iterator_facade.html

答案 2 :(得分:2)

你真的在循环,直到你找到一个未设置的F。

使用std::find_if

#include <algorithm>
#include <iterator>

template<typename Type>
bool doSomethingOrStopIfNotSet(F<Type>& object)
{
    const bool isSet = object.isSet(); 
    if(isSet)
    {
        // do something
    }
    return !isSet; // return false so that find_if keeps looking
}

int main()
{
    F<int> arr[100];
    std::find_if(std::begin(arr), std::end(arr), doSomethingOrStopIfNotSet<int>);
}