Примечание. Вопрос не в том, следует ли мне "использовать список или очередь". Это вопрос валидности итераторов перед лицом 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 я заметил, что двухсторонняя очередь и список ведут себя по-разному по отношению к readpos = buf.end()
: после вставки в конце readpos прерывается в списке, но указывает на следующий элемент в дека. Это стандартная гарантия?
(Согласно cplusplus, любой deque::insert() недействителен все итераторы. Это нехорошо. Может быть, лучше использовать счетчик, чем итератор, для отслеживания позиции в двухсторонней очереди?)
end()
почти наверняка будет ссылаться на освобожденную память. - person Nemo   schedule 03.06.2011deque
вы можете сохранить числовой индекс текущей позиции вместо итератора. - person sbk   schedule 03.06.2011std::list
остаются действительными при любой вставке. Кроме того, если вы хотите знать, следует ли вам использоватьlist
илиdeque
, я советую использоватьvector
и целочисленные индексы (пока размер данных относительно мал). Хорошая рыба-дурманка, кстати. - person bobobobo   schedule 06.09.2013end()
, для которого я не смог найти стандартную гарантию того, что он останется в силе. - person Kerrek SB   schedule 06.09.2013