Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个C++;方法可以简化吗?_C++_Algorithm_Debugging_C++14 - Fatal编程技术网

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

C++ 这个C++;方法可以简化吗?,c++,algorithm,debugging,c++14,C++,Algorithm,Debugging,C++14,背景: 我已经将该算法实现为一个带有匹配自定义迭代器的STL容器。在其他成员中,Buffer类有两个内部指针\u gapStart和\u gapEnd,分别表示间隙的开始和结束 BufferIterator有两个成员\u buffer,这是对它正在迭代的缓冲区类的引用,还有\u pos,这是缓冲区中的当前位置。与普通迭代器不同的是,当它在缓冲区中前后移动时,它应该“跳过”间隙 为此,下面的代码实现了操作符+=(所有其他迭代器算术操作符都是根据它定义的)。这个代码可以工作,但我有一种烦人的感觉,它

背景:

我已经将该算法实现为一个带有匹配自定义迭代器的STL容器。在其他成员中,Buffer类有两个内部指针
\u gapStart
\u gapEnd
,分别表示间隙的开始和结束

BufferIterator
有两个成员
\u buffer
,这是对它正在迭代的缓冲区类的引用,还有
\u pos
,这是缓冲区中的当前位置。与普通迭代器不同的是,当它在缓冲区中前后移动时,它应该“跳过”间隙

为此,下面的代码实现了
操作符+=
(所有其他迭代器算术操作符都是根据它定义的)。这个代码可以工作,但我有一种烦人的感觉,它可以变得更简单

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;
}
BufferIterator&operator+=(常量差分类型&n){
如果(n>=0){
_pos+=n;
如果(_pos>=b._gapStart){
_pos+=(b._gapEnd-b._gapStart);
}
}否则{
_pos-=n;

如果(_pos第一版可以简化为:

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;
}
要删除循环,您的代码可能如下所示:

BufferIterator& operator+=(const difference_type& n) {
    if (n >= 0) {
        if (_pos < b._gapStart && b._gapStart <= _pos + n) {
            _pos += b._gapEnd - b._gapStart;
        }
    } else {
        if (_pos + n <= b._gapEnd && b._gapEnd < _pos) {
            _pos -= (b._gapEnd - b._gapStart);
        }
    }
    _pos += n;
    return *this;
}
BufferIterator&operator+=(常量差分类型&n){
如果(n>=0){

如果(_pos\u gapStart=2;\u gapEnd=4;pos=10;n=10;
新的pos现在应该是什么?PS这是单元测试应该捕捉到的事情。在第一个示例中,
\u pos+=(\u buffer.\u gapEnd-\u buffer.\u gapStart)后面不应该有一个break语句吗;
?除非您在多个缓冲区上进行迭代,否则当前缓冲区不明显code@smac89有一个失踪的女孩)我已经确定了这一点,但这并不意味着你需要休息。LokiAstari感谢JAROD42,我发现问题所在。我指的是单元测试。我是一个专业的开发人员,但只是C++中的爱好者。我很少做类似的项目来保持我的技能,但我还不知道所有的Pro工具。我要研究一下。当我有机会的时候,单元测试框架。谢谢。我使用了你的第二个版本。我做了一个小优化,我删除了每个if/else块的最后一行,并在返回之前用
\u pos+=n;
替换它。@Jaldhar,只是为了确保:返回之前的
\u pos+=n
与你最初在que中的不相等stion.您的原始代码(以及Jarod42的代码)导致
\u pos
增加,而不管
n
的符号是什么,因为如果
n>=0
,您添加了
n
,否则您减去了
n
,但
n
是负数,因此您添加了
abs(n)
。通过您所做的优化,您在第二种情况下减少了
pos
。如果这是您所期望的,很好,但只是想让您注意这个细节。@Free昵称是的,这是预期的行为。看起来我在最初编写代码时真的没有思考清楚!@Jaldhar它发生了:)