класс C ++ с итератором, но без контейнера - PullRequest
3 голосов
/ 14 июня 2011

Я пытаюсь реализовать класс, который позволил бы мне перебирать объекты в стиле STL без явного сохранения их в контейнере.

Упрощенным примером этого будет, скажем, <Paragraph>::iterator в классе, который на самом деле не имеет контейнера Paragraphs, но вместо этого имеет переменную <string> text.Легко создать функцию-член, которая на самом деле проходит по тексту построчно и собирает абзацы, но мне кажется глупым снова хранить весь этот текст в каком-то контейнере, чтобы я мог наследовать от его итераторов.

Кроме того, причина, по которой я назвал это <Paragraph>::iterator, а не <string>::iterator, заключается в том, что я могу захотеть использовать итератор другого типа.Например, я мог бы посчитать количество символов в каждом из абзацев и получить <int>::iterator.

Наверное, у меня такой вопрос: уместно ли думать с точки зрения итераторов, когда нет контейнера?

Спасибо

Ответы [ 4 ]

6 голосов
/ 14 июня 2011

уместно ли думать в терминах итераторов, когда нет контейнера?

Это не только уместно, но и превосходное мышление: классы должны иметьБережливые интерфейсы - то есть они должны показывать только то, что им нужно , и ничего больше.То, как вы обрабатываете абзацы внутри себя (храните ли вы их в контейнере и, если да, в каком контейнере), является деталью реализации и не относится к интерфейсу класса.

Класс должен в любом случае тольковыставить диапазон итераторов абзацев.И как только вы избавитесь от контейнера на уровне интерфейса, у вас может не быть причины иметь контейнер внутри класса, как вы сами заметили.

4 голосов
/ 14 июня 2011

Да, концепция итератора полностью независима от концепции контейнера.

Например, в стандартной библиотеке есть набор потоковых итераторов. Все, что может быть повторено, должно быть представлено итераторами в C ++, независимо от того, существует ли основной контейнер в памяти.

1 голос
/ 14 июня 2011

Boost.Range ориентирован на эту концепцию.

http://www.boost.org/doc/libs/release/libs/range/index.html

0 голосов
/ 14 июня 2011

Похоже, вы воспринимаете объект Paragraph как контейнер с параграфами.Но не будет ли Paragraph частью контейнера Paragraph с?и каждый Paragraph будет контейнером слов (или строкой, в зависимости от ваших потребностей)?так что вы можете использовать итератор std::string в объекте Paragraph и контейнер std для хранения Paragraph?

. Вы все равно можете создать собственный итератор для итерации по своему желанию, однакохочу, ответ на этот вопрос дает хороший обзор того, как структурировать ваш класс итератора.

...