Manter std :: listar iteradores válidos por inserção
Nota Esta não é uma pergunta se eu deveria "usar lista ou deque". É uma pergunta sobre a validade dos iteradores em face deinsert()
.
Essa pode ser uma pergunta simples e eu sou muito densa para ver o caminho certo para fazer isso. Estou implementando (para melhor ou para pior) um buffer de tráfego de rede como umstd::list<char> buf
, e estou mantendo minha posição atual de leitura como iteradorreadpos
.
Quando adiciono dados, faço algo como
buf.insert(buf.end(), newdata.begin(), newdata.end());
Minha pergunta é agora, como faço para manter oreadpos
iterador válido? Se apontar para o meio da antigabuf
, então tudo ficará bem (pelo iterador garante std :: list), mas normalmente eu posso ter lido e processado todos os dados e tenhoreadpos == buf.end()
. Após a inserção, eu queroreadpos
sempr para apontar para o próximo caractere não lido, que no caso da inserção deve ser o primeiro inserid
Alguma sugestão? (Curto de alterar o buffer parastd::deque<char>
, que parece ser muito mais adequado à tarefa, conforme sugerido abaixo.)
Atualizar Em um teste rápido com o GCC4.4, observo que o deque e a lista se comportam de maneira diferente em relação areadpos = buf.end()
: Depois de inserir no final, o readpos é quebrado em uma lista, mas aponta para o próximo elemento em um deque.Isso é uma garantia padrão?
(De acordo com cplusplus, qualquer deque :: insert () invalidado todos os iteradores. Isso não é bom. Talvez usar um contador seja melhor que um iterador para rastrear uma posição em um deque?)