这个C ++方法可以简化吗?

时间:2017-11-06 05:12:40

标签: c++ algorithm debugging c++14

背景:

我一直在将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

1 个答案:

答案 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;
}