Написание пользовательских для цикла в C ++ - PullRequest
3 голосов
/ 08 августа 2011

Мне было интересно, возможно ли это, обычай для цикла. Я имел в виду выражение foreach из java, которое

for(Container c : Element e){
      // do stuff with e
} 

Я хотел написать его для пользовательского контейнера, который я написал (давайте назовем его cust_cont), который я хотел работать с циклом foreach (например, из boost). Но прежде чем читать итераторы и тому подобное, я хотел бы спросить, могу ли я просто реализовать нужный цикл, если это необходимо явно.

Ответы [ 4 ]

4 голосов
/ 08 августа 2011

Не уверен, что я понимаю ваш вопрос, но да, вы должны реализовать методы begin() и end() (в идеале перегруженные на const), чтобы итерация работала с вашим пользовательским контейнером.Кроме того, вам нужны вложенные типы iterator и const_iterator (или typedefs).Подводя итог, вот что вам нужно:

типы элементов:

MyClass::iterator
MyClass::const_iterator

функции-члены:

MyClass::iterator MyClass::begin();
MyClass::const_iterator MyClass::begin() const;
MyClass::iterator MyClass::end();
MyClass::const_iterator MyClass::end() const;
3 голосов
/ 08 августа 2011

Такой цикл называется цикл на основе диапазона , который является функцией, добавленной в C ++ 0x.

Итак, в C ++ 0x вы можете написать это:

for(Element e : c) {
      // do stuff with e
} 

, где c - это контейнер объекта типа Element, который определил begin и end как функции-члены, ИЛИ может быть передано в begin() и end() функции, которые являютсяпоиск с аргументно-зависимым поиском (ADL), и std является одним из связанных пространств имен.

0 голосов
/ 12 апреля 2017

См. ответ fredoverflow о том, как сделать это для пользовательского контейнера, но с c ++ 11 это стало еще проще с помощью auto

for(auto element : container)
    //do something with element
0 голосов
/ 08 августа 2011

вы можете написать макрос, что-то вроде этого:

foreach(Element, e, c) { ... }
...