Примечание. Это не вопрос, следует ли мне "использовать список или deque". Это вопрос о действительности итераторов в лице insert().
Это может быть простой вопрос, и я просто слишком плотный, чтобы увидеть правильный способ сделать это. Я использую (к лучшему или худшему) буфер сетевого трафика как std::list<char> buf, и я поддерживаю текущую позицию чтения как итератор readpos.
Когда я добавляю данные, я делаю что-то вроде
buf.insert(buf.end(), newdata.begin(), newdata.end());
Теперь мой вопрос: как я могу сохранить итератор readpos? Если он указывает на середину старого buf, тогда это должно быть хорошо (по гарантии итератора для std:: list), но обычно я мог читать и обрабатывать все данные, и у меня есть readpos == buf.end(). После вставки я хочу, чтобы readpos всегда указывал на следующий непрочитанный символ, который в случае вставки должен быть первым вставленным.
Любые предложения? (Не дожидаясь замены буфера на std::deque<char>, который, по-видимому, намного лучше подходит для задачи, как показано ниже.)
Обновление: Из быстрого теста с GCC4.4. Я наблюдаю, что deque и list ведут себя по-разному относительно readpos = buf.end(): после вставки в конце readpos разбивается в списке, но указывает к следующему элементу в deque. Является ли это стандартной гарантией?
(Согласно cplusplus, любая deque:: insert() недействительна для всех итераторов. Это нехорошо. Возможно, использование счетчика лучше чем итератор для отслеживания позиции в deque?)