注:これは、「リストを使用するか、デキューを使用するか」という問題ではありません。に直面したイテレータの有効性についての質問ですinsert()
。
これは簡単な質問かもしれませんが、私はこれを行う正しい方法を理解するにはあまりにも密集しています。ネットワーク トラフィック バッファを (良くも悪くも) として実装std::list<char> buf
し、現在の読み取り位置を iterator として維持していますreadpos
。
データを追加するときは、次のようにします
buf.insert(buf.end(), newdata.begin(), newdata.end());
readpos
私の質問は、イテレータを有効に保つにはどうすればよいですか? それが old の中間を指している場合、buf
(std::list のイテレータ保証により) 問題ないはずですが、通常はすべてのデータを読み取って処理した可能性があり、readpos == buf.end()
. readpos
挿入後、常に次の未読文字を指すようにしたいのですが、挿入の場合は最初に挿入された文字でなければなりません。
助言がありますか?(以下に提案されているように、バッファを a に変更するstd::deque<char>
だけで、タスクにより適しているように見えます。)
更新: GCC4.4 を使用した簡単なテストから、deque と list の動作が次の点で異なることがreadpos = buf.end()
わかりました。最後に挿入した後、readpos はリスト内で壊れていますが、deque 内の次の要素を指しています。これは標準保証ですか?
( cplusplusによると、すべての deque::insert()はすべてのイテレータを無効にしました。これは良くありません。両端キュー内の位置を追跡するには、イテレータよりもカウンタを使用する方がよいでしょうか?)