Примечание. Это не вопрос, следует ли мне "использовать список или 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?)