std::advance和std::next有什么区别?
What's the difference between std::advance and std::next?
除了超前取负数之外还有更多吗?
std::advance
- 修改其论点
- 不返回任何内容
- 适用于输入迭代器或更好的迭代器(如果给定负距离,则适用于双向迭代器)
std::next
- 不修改其参数
- 返回参数的副本,按指定的金额提前
- 适用于前向迭代器或更好的迭代器(如果给定负距离,则适用于双向迭代器)
也许最大的实际区别是std::next()
只能从C++11中获得。
默认情况下,std::next()
将前进1,而std::advance()
需要一段距离。
然后是返回值:
-
std::advance()
:(none)(传入的迭代器被修改) -
std::next()
:第n个继承者
std::next()
和std::advance
一样取负数,在这种情况下要求迭代器必须是双向的。当意图特别是向后移动时,CCD_ 10将更具可读性。
std::advance
函数advanced()递增作为参数传递的迭代器的位置。因此,该函数允许迭代器前进(或后退)不止一个元素:
#include <iterator>
void advance (InputIterator& pos, Dist n)
- 允许输入迭代器pos向前(或向后)步进n个元素
- 对于双向和随机访问迭代器,n可能为负数以向后退一步
- Dist是一种模板类型。通常,它必须是整型,因为诸如<、++、--、,与0的比较是呼叫
- 请注意,advanced()不检查它是否越过了序列的end()(它不能检查,因为迭代器通常不知道它们操作的容器)。因此,调用此函数可能导致未定义的行为,因为正在为结尾调用运算符++未定义序列的
std::next(以及C++11中的std::prev
新)
#include <iterator>
ForwardIterator next (ForwardIterator pos)
ForwardIterator next (ForwardIterator pos, Dist n)
- 产生前向迭代器pos在向前移动1或n个位置时的位置
- 对于双向和随机访问迭代器,n可以为负以产生先前的position
- Dist的类型为std::iterator_traits::difference_type
- 为内部临时对象调用advance(pos,n)
- 请注意,next()不会检查它是否与序列的end()相交。因此,由调用者来确保结果有效
引用The C++ Standard Library Second Edition
它们几乎相同,只是std::next
返回一个副本,std::advance
修改其参数。请注意,该标准要求std::next
的行为与std::advance
:类似
24.4.4迭代器操作[Iterator.operations]
template <class InputIterator, class Distance> void advance(InputIterator& i [remark: reference], Distance n);
2.要求:n仅对双向和随机访问迭代器为负数
3.效果:递增(或递减负n)迭代器引用i乘以n。
[…]template <class ForwardIterator> ForwardIterator next(ForwardIterator x, [remark: copy] typename std::iterator_traits<ForwardIterator>::difference_type n = 1);
6.效果:相当于
advance(x, n); return x;
请注意,如果迭代器是输入迭代器,则和实际上都支持负值。还要注意,std::next
需要迭代器满足ForwardIterator的条件,而std::advance
只需要输入迭代器(如果不使用负距离)。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- std::enable_if 和 std::enable_if_t 有什么区别?
- "owned pointer"和 std::shared_ptr 的"stored pointer"有什么区别?
- std::ranges::begin 和 std::begin 有什么区别?
- std::stable_partition() 和 std::p artition() 有什么区别?
- std::fabs(a * b) 和 std::fabs(a) * std::fabs(b) 之间的区别
- 普通的右值引用和 std::forward 返回的引用有什么区别?
- std::tie 和 std::forward_as_tuple 有什么区别
- printf() 和 std::cout 在指针方面的区别
- malloc 和 calloc 与 std::string 之间的区别
- std::random_device和std::mt19937_64之间有什么区别
- 使用 std::move 将参数传递给函数,如果该参数声明为按值传递或使用移动操作数 &&,是否有区别?
- 打印一个带有静态 int 的函数,有一个 std::cout 和多个 std::cout 有什么区别?
- std::bit_cast 和 std::start_lifetime_as 之间有什么有用的区别吗?
- Python的bisect.bisect_left和C++的std::upper_bound的区别
- 互锁变量访问(在布尔值上)和 std::atomic_flag 之间的区别
- std::string [] 运算符和 at() 之间的区别
- 当应该使用它们时,std::stof 和 atof 有什么区别?