Примечание: Это не вопрос, должен ли я использовать список или 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 () делает недействительными всех итераторов. Это бесполезно.Может быть, использование счетчика лучше, чем итератор, для отслеживания позиции в деке?)