c++ - 令 iter 为 std::iterator。std::next(iter,1) 和 ++iter 之间有什么区别吗?
问题描述
请考虑以下代码:
#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;
}
正如您在此处看到的,实现 1 和实现 2 产生相同的输出。总是这样吗?
解决方案
在您的代码中没有区别。两者都会使迭代器前进一步。
举一个可能很重要的例子,假设我们要打印范围的第二个元素,我们不能写这样的东西,++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());
| ~~~~~~~^~
推荐阅读
- java - Java Spring Boot 不会从 application.yml 中获取变量
- python - 从 Python 中的 HTML 项目符号列表中提取数据
- angular - 运行 NPM 命令时出现错误请求
- c++ - C++ 不是要求 (cond ? string_1 : string_2) 初始化一个字符串吗?
- jenkins-pipeline - 打印詹金斯凭据ID
- firebase - Firebase使用react native获取数据在android 10上不起作用
- c# - 匿名类型成员平等
- macros - 在 guile 方案中,如何在外部宏和内部宏之间共享语法?
- node.js - typeorm 在“ORDER”处或附近产生语法错误
- python-3.x - 从一个文本文件中提取行并使用正则表达式将它们放入两个不同的文本文件中?#Python