为什么转发迭代器没有加法赋值运算符?
Why doesn't forward iterator have addition assignment operator?
我知道std::forward_list<T>::iterator
没有复合赋值运算符(operator+=
)。但这是为什么呢?
我问这个有三个原因:
- 这个运算符不会像
operator++()
一样推进"前向"迭代器吗? - 难道没有一个辅助函数
std::advance()
做同样的事情吗?
我 - 正在实现自己的转发列表(用于学习),我想知道
operator+=()
有什么问题。
使用:
std::advance(it, n);
(<iterator>
年宣布)
关键是,仅当运算具有 O(1) 成本时才提供复合赋值运算符。由于递增前向迭代器具有线性成本,因此最好将其显式化。
如果需要重复增量结果的新值,请使用:
auto it2 = std::next(it1, n);
但我不知道为什么?
前向迭代器一次只能向前推进一个单元。 +=
通常用于一次使用多个单元。
这个运算符不会像
operator++()
一样推进"前向"迭代器吗?
它会的,但你可以像iterator += 10
一样使用它,这会让你相信它会立即前进 10 位。 相反,它必须是 10 个单独的++
调用。
没有做同样事情的辅助函数 std::advance() 吗?
是的,但它明确指出它是多个++
调用,除非您使用随机迭代器。
我正在实现自己的转发列表(用于学习),我想知道运算符+=()有什么问题
迭代器应符合前向迭代器的标准定义。
但我不知道为什么?
不同类别的迭代器必须遵循某些契约。描述可以在这里找到 您可以看到前向迭代器类别的合约是什么,std::forward_list<T>::iterator
属于哪里,并且没有针对 RandomAccessIterator 的r += n
操作
相关文章:
- 重载Singly Linked List中的赋值运算符
- 使用赋值运算符重载从类中返回jobject
- 标准库类型的赋值运算符的引用限定符
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 基类和派生类的多态赋值运算符
- 为用户定义的类正确调用复制构造函数/赋值运算符
- CRTP 中的复制赋值运算符 - gcc vs clang 和 msvc
- 为什么初始化时没有调用重载赋值运算符?
- 赋值运算符重载和自赋值
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- Qt PL/SQL - 赋值运算符 - 字符串缓冲区太小
- 对 r 值使用移动赋值运算符时的异常
- 由于没有使用赋值运算符,映射的值是如何初始化的?
- 默认赋值运算符如何在实际 STL 中实现
- 使用赋值运算符复制 std::vector
- C++ 通过自定义赋值运算符隐式转换函数参数
- 为什么转发迭代器没有加法赋值运算符?
- 是否有方法将所有赋值运算符(+=、*=等)转发为隐式使用重写的直接赋值运算符(=)