gap bufferアルゴリズムは、一致するカスタムイテレータを持つSTLコンテナとして実装しています。 Bufferクラスには、他のメンバーの中に、ギャップの開始と終了をそれぞれ表す2つの内部ポインタ_gapStart
と_gapEnd
があります。
BufferIterator
には、反復処理中のBufferクラスへの参照である_buffer
と、バッファ内の現在の位置である_pos
という2つのメンバがあります。通常のイテレータと異なる点は、バッファを前後に移動するときにギャップをスキップすることです。
この目的のために、operator+=
(他のすべての反復子算術演算子はそれに関して定義されています)を実装する以下のコードを持っています。このコードは機能しますが、私はそれをもっと簡単にすることができると感じています。
BufferIterator& operator+=(const difference_type& n) {
auto count = n;
if (count >= 0) {
while (count--) {
++_pos;
if (_pos == _buffer._gapStart) {
_pos += (_buffer._gapEnd - _buffer._gapStart);
}
}
} else {
while (count++) {
--_pos;
if (_pos == _buffer._gapEnd) {
_pos -= (_buffer._gapEnd - _buffer._gapStart);
}
}
}
return *this;
}
ですので、以下のバージョンに置き換えます。しかし、それは動作しません。 segfaultが発生します。どうして?それは私には完全に同等でなければならないと思われ、なぜそうではないのか分かりません。
BufferIterator& operator+=(const difference_type& n) {
if (n >= 0) {
_pos += n;
if (_pos >= b._gapStart) {
_pos += (b._gapEnd - b._gapStart);
}
} else {
_pos -= n;
if (_pos <= b._gapEnd) {
_pos -= (b._gapEnd - b._gapStart);
}
}
return *this;
}
誰でもこのことを理解できますか?バージョン1を実装する簡単な方法はありますか、それとも本当にそれを実装する最良の方法ですか?
Btw文脈でコードを見ることができれば、私の簡単なエディタはon Githubです。
:
、ループを削除するには、あなたのコードは次のようになります。 codereviewと私は貴重なフィードバックを持っていますが、このビットではありません。なぜ私は2つのバージョンが同等ではないのかを理解したいと思っています。私はそのような疑問は、SOのbailiwickの方が多いと思っていました。 – Jaldhar
2番目のバージョンにバグがあります。 '_gapStart = 2;を考えてください。 _gapEnd = 4; pos = 10; n = 10; '今は新しいposは何ですか? PSこれは単体テストが捕まえるべきものです。 –
最初の例では、 '_pos + =(_buffer._gapEnd - _buffer._gapStart);の後にbreak文を置かないでください。複数のバッファを反復処理している場合を除きます。あなたの現在のコードでは分かりません – smac89