Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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++ 为什么';t前向迭代器是否具有加法赋值运算符?_C++_Iterator_Forward List - Fatal编程技术网

C++ 为什么';t前向迭代器是否具有加法赋值运算符?

C++ 为什么';t前向迭代器是否具有加法赋值运算符?,c++,iterator,forward-list,C++,Iterator,Forward List,我知道std::forward\u list::iterator没有复合赋值运算符(operator+=)。但为什么呢 我问这个问题有三个原因: 这个操作符不会像操作符++()那样推进“向前”迭代器吗 难道没有一个辅助函数做同样的事情吗 我正在实现我自己的转发列表(用于学习),我想知道operator+=()有什么问题 使用: (在中声明) 关键是,复合赋值运算符仅在操作成本为O(1)时提供。由于递增前向迭代器具有线性成本,因此最好将其显式化 如果需要一个由重复增量产生的新值,请使用: auto

我知道
std::forward\u list::iterator
没有复合赋值运算符(
operator+=
)。但为什么呢

我问这个问题有三个原因:

  • 这个操作符不会像
    操作符++()
    那样推进“向前”迭代器吗
  • 难道没有一个辅助函数做同样的事情吗
  • 我正在实现我自己的转发列表(用于学习),我想知道
    operator+=()
    有什么问题
  • 使用:

    (在
    中声明)

    关键是,复合赋值运算符仅在操作成本为O(1)时提供。由于递增前向迭代器具有线性成本,因此最好将其显式化

    如果需要一个由重复增量产生的新值,请使用:

    auto it2 = std::next(it1, n);
    
    但我不知道为什么

    前向迭代器一次只能向前推进一个单元<代码>+=通常用于一次运行多个单元

    这个操作符不会像
    操作符++()
    那样推进“向前”迭代器吗

    它会的,但是你可以像
    迭代器+=10
    那样使用它,这会让你相信它会立即前进10位。相反,它必须是10个独立的
    ++
    调用

    难道没有辅助函数std::advance()做同样的事情吗

    是的,有,但它明确声明它是多个
    ++
    调用,除非您使用的是随机迭代器

    我正在实现我自己的转发列表(用于学习),我想知道运算符+=()

    迭代器应该符合前向迭代器的标准定义

    但我不知道为什么


    不同的类别迭代器必须遵循一定的约定。可以找到描述您可以看到类别的合同是什么,其中
    std::forward_list::iterator
    所属,并且没有针对
    r+=n
    的操作,我希望有人回答这个问题,因为标准上这么说,“我很高兴(对于OP)您没有这样做+1.
    it+=2
    真的比
    advance(it,2)
    更不明确吗?@Barry:委员会认为是这样的。这并不是说
    +=2
    不可理解,但人们并不认为这是一个昂贵的操作。迭代器是指针的泛化,当你看到
    +=2
    时,你首先想到的是指针算法。@Barry:(我听说过迭代器连接到数据库的故事…@KerrekSB是的,我不怀疑这是正确的原因-但这只是一点。。。奇怪。下行投票人能解释这个问题出了什么问题吗?另外一个问题:如果添加负数怎么办?@Revolver\u Ocelot很好,可以通过对函数参数使用无符号类型来解决;)不幸的是,std::advance也允许这样做。
    auto it2 = std::next(it1, n);