Примечание: Это не вопрос, следует ли мне «использовать список или двухстороннюю очередь». Это вопрос о допустимости итераторов перед insert ()
.
Это может быть простой вопрос, и я слишком туп, чтобы понять, как это сделать. Я реализую (к лучшему или худшему) буфер сетевого трафика как std :: list
, и я сохраняю свою текущую позицию чтения как итератор 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 () аннулирует все итераторы. Это бесполезно. Может быть, лучше использовать счетчик чем итератор для отслеживания позиции в двухсторонней очереди?)