Как добавить поддержку итерации foreach в мой собственный класс коллекции в C ++? - PullRequest
2 голосов
/ 16 августа 2011

Я создал реализацию C ++ типа коллекции. Я хотел бы добавить поддержку итераций, чтобы разработчики могли использовать оператор «для каждого». Как я могу это сделать?

Ответы [ 4 ]

5 голосов
/ 16 августа 2011

Стандартная идиома: выставить типы iterator и const_iterator и предоставить как минимум две функции, а именно begin() и end() как:

template</*.....*/>
class Collection
{
 public:
     typedef /*...*/ iterator;
     typedef /*...*/ const_iterator;

     iterator begin();
     iterator end();

     const_iterator begin() const;
     const_iterator end() const;
};

Как только вы реализуете их, ваша коллекция может использоваться в std::for_each и во многих других алгоритмических функциях, определенных в <algorithm>.

1 голос
/ 16 августа 2011

Если вы имеете в виду алгоритм for_each STL, вам просто нужно определить begin() и end(), как это делают контейнеры STL.

Если вы имеете в виду цикл for, основанный на диапазоне C ++ 0x,тогда вы можете сделать то же самое.

1 голос
/ 16 августа 2011

Предполагая, что вы имеете в виду алгоритм for_each, вам просто нужно нечто, представляющее стандартные методы контейнеров begin и end: итераторы для первой и последней конечной точки в вашем логическом контейнере.

0 голосов
/ 16 августа 2011
using namespace std;

// very very simple container class
class Cont {
public:
    Cont() {}
    typedef char* iterator;
    iterator begin() {return arr;}
    iterator end() {return &arr[200];}

private:
    char arr[200];
};

void setit(char &it) {
    it = 'a';
} 
// iterator must provide ++ operation for for_each algorithm (char* in this example works this way)
int main() {
    Cont c;
    for_each(c.begin(), c.end(), setit);
    copy(c.begin(), c.end(), ostream_iterator<char>(cout, ","));
    return 0;
}
...