2015-09-17 3 views
0

Я пишу класс, который содержит коллекцию дочерних объектов одного и того же класса, и хотел бы итерацию, и индекс, через них, используя стандартные предоставленные функции вместо функций, таких как: first(), next(), previous(), last(), getchild(x) и т.д. .Какие функции я должен реализовать, чтобы сделать класс итерабельным?

В C++ 14, какие функции я должен реализовать, чтобы сделать класс итерабельным/индексируемым во всех случаях?

Функции:

  • begin()
  • cbegin()
  • rbegin()
  • crbegin()
  • end()
  • cend()
  • rend()
  • crend()

приходит на ум, хотя, вероятно, не обязательно все из них должны быть реализованы. Кроме того, возможно (для удобства программиста):

  • size()
  • empty()

Существуют ли какие-либо другие функции, которые я должен реализовать, как предварительно увеличения/уменьшения или после увеличения/уменьшения и массива или это действительно просто begin() и end() и их варианты?

+0

Перегруженные операторы '++, -, +, -' – Steephen

+0

Я не думаю, что существует «итерируемая» концепция, так что это в значительной степени зависит от вас. Существует концепция [Контейнер] (http://en.cppreference.com/w/cpp/concept/Container) и несколько итераторов. – juanchopanza

ответ

2

Если ваш контейнер реализует begin() и end() в качестве функций-членов, а тип возвращаемых функций поддерживает оператор pre-increment, вы можете использовать его в большинстве контекстов. Важные те, что я могу думать о том, являются:

  1. range-for. Вы можете использовать:

    Container c; 
    for (auto& item : c) { ... } 
    
  2. Функции, которые работают с итераторами. Пример:

    Container c; 
    Item item; 
    std::find(c.begin(), c.end(), item); 
    

Создание итератора суб-класс std::iterator является лучшим способом, чтобы убедиться, что он будет совместим со всеми стандартными алгоритмами. (Спасибо @Adrian).

+2

"и возвращаемый тип функций поддерживает оператор предварительного инкремента" Итератор должен также иметь определенные typedefs, такие как 'value_type' и т. Д., Иначе использование их со стандартными контейнерами может не скомпилироваться. Лучший способ сделать это - подкласс 'std :: iterator'. – Adrian17

Смежные вопросы