请考虑以下代码:
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::vector<int> v{1,2,3};
// implementation 1:
for(auto iter = v.begin(); iter !=v.end(); ++iter)
std::cout << *iter;
std::cout << std::endl;
// implementation 2:
for(auto iter = v.begin(); iter !=v.end(); iter = std::next(iter, 1))
std::cout << *iter;
std::cout << std::endl;
}
您可以看到here实现1和实现2产生相同的输出。总是这样吗?
答案 0 :(得分:3)
在您的代码中没有区别。两者都会使迭代器前进一步。
仅举一个可能有意义的示例,假设我们要打印范围的第二个元素,我们无法编写类似++b.begin()
的内容,因为我们无法将++
应用于一个右值。
这是一个代码示例。
#include <array>
#include <iostream>
int main()
{
std::array<int, 2> a = {2, 4};
//std::cout << *(++a.begin()); // This will fail
std::cout << *std::next(a.begin());
}
如果我们取消注释第一行gcc表示
prog.cc: In function 'int main()':
prog.cc:8:29: error: lvalue required as increment operand
8 | std::cout << *(++a.begin());
| ~~~~~~~^~
答案 1 :(得分:0)
是的iter = std::next(iter, 1)
等同于++iter
。
我能想到的std::next(iter, 1)
和++iter
之间的唯一区别是std::next
不会修改迭代器,它会返回结果迭代器的副本。
另外,std::next
在通用上下文中非常有用,其中iterator
可以是random access
,forward
等,它将使用最合适的方式来推进迭代器。 >