Сохранение итераторов std :: list действительными посредством вставки

Примечание: Это не вопрос, следует ли мне «использовать список или двухстороннюю очередь». Это вопрос о допустимости итераторов перед insert () .


Это может быть простой вопрос, и я слишком туп, чтобы понять, как это сделать. Я реализую (к лучшему или худшему) буфер сетевого трафика как std :: list buf , и я сохраняю свою текущую позицию чтения как итератор readpos .

Когда я добавляю данные, я делаю что-то вроде

buf.insert(buf.end(), newdata.begin(), newdata.end());

Теперь у меня вопрос, как сохранить итератор readpos действующим? Если он указывает на середину старого buf , тогда все должно быть в порядке (согласно гарантиям итератора для std :: list), но обычно я мог прочитать и обработать все данные, и у меня есть readpos == buf.end () . После вставки я хочу, чтобы readpos всегда указывал на следующий непрочитанный символ, который в случае вставки должен быть первым вставленным.

Есть предложения? (Если не считать изменения буфера на std :: deque , который, по-видимому, намного лучше подходит для этой задачи, как предлагается ниже.)

Обновление: Из быстрого теста с GCC4.4 я заметил, что deque и list ведут себя по-разному относительно readpos = buf.end () : после вставки в конце readpos прерывается в списке, но указывает на следующий элемент в дек. Является ли это стандартной гарантией?

(Согласно cplusplus , любой deque :: insert () аннулирует все итераторы. Это бесполезно. Может быть, лучше использовать счетчик чем итератор для отслеживания позиции в двухсторонней очереди?)

6
задан Charles 29 October 2012 в 16:34
поделиться