2016-12-01 17 views
2

В соответствии с cppreference.com:Как написать STL-совместимый контейнер, но его размер неизвестен?

Любой СТЛ-совместимый контейнер должен обеспечивать функцию члена size().

Теперь я должен написать STL-совместимый контейнер MyContainer, MyContainer::iterator представляет собой тип std::input_iterator, то есть MyContainer может быть пройдена только один проход. Например, я использую MyContainer для хранения результата SQL-запроса и использую его iterator для записи записей один за другим.

Я столкнулся с такой проблемой: MyContainer может предоставить begin() и end() для перемещения своих значений, но не может предварительно определить общий размер его значений.

Как это сделать в таком случае?

+4

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

+0

Вам нужен «поток», а не контейнер. Вы можете начать с чего-то из решения 'std :: istream'. – Arunmu

+0

'stream' - это ориентированное на характер решение, которое не соответствует моей проблеме. Я думаю. – xmllmx

ответ

2

В стандарте C++ существует некоторое замешательство в отношении требований контейнера. Хотя требования к итераторам являются истинными требованиями (например, стандартные алгоритмы предполагают, что итераторы будут иметь определенные свойства, определенные требованиями), в стандартной библиотеке нет ничего, что зависит от любого контейнера, удовлетворяющего «требованиям контейнера». Эти требования, по сути, являются проектными утверждениями о конкретных контейнерах, определенных в стандарте, а не требованиями в том смысле, что их не встретит разрыв кода.

Подумайте о контейнерах как способе предоставления итераторов по последовательности значений. Это важно, но это не единственный способ создания полезных итераторов. Например, входные потоки не являются контейнерами (и вообще не имеют способа определить их размер), но они предоставляют итераторы (в виде istream_iterator), которые могут быть переданы в стандартные алгоритмы. В этом нет ничего плохого. Просто сделай это.