背景:
我一直在将gap buffer算法实现为具有匹配自定义迭代器的STL容器。 Buffer类在其他成员中有两个内部指针_gapStart
和_gapEnd
,它们分别代表间隙的开始和结束。
BufferIterator
有两个成员_buffer
,它是对迭代的Buffer类的引用,_pos
是Buffer中的当前位置。它与普通迭代器的不同之处在于,当它在缓冲区中前后移动时,它应该跳过"跳过"差距。
为此,我有下面的代码实现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;
}
所以我想用下面的版本替换它。然而它并没有起作用;它会导致段错误。为什么?在我看来它应该是完全等价的,我无法弄清楚它为什么不是。
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,还是真正实现它的最佳方式?
顺便说一下,如果在上下文中查看代码会有帮助,可以找到我的简单编辑器on Github。
答案 0 :(得分:3)
第一个版本可以简化为:
table=StaticValueProvider(str, custom_options.table.get())
要删除循环,您的代码可能如下所示:
BufferIterator& operator+=(const difference_type& n) {
auto count = n;
if (count >= 0) {
while (count--) {
++_pos;
if (_pos == _buffer._gapStart) {
_pos = _buffer._gapEnd;
}
}
} else {
while (count++) {
--_pos;
if (_pos == _buffer._gapEnd) {
_pos = _buffer._gapStart;
}
}
}
return *this;
}