假设,我已经C++像这样声明了一个向量:
vector<int>numbers = {4,5,3,2,5,42};
Run Code Online (Sandbox Code Playgroud)
我可以通过以下代码迭代它:
for (vector<int>::iterator it = numbers.begin(); it!=numbers.end(); it++){
// code goes here
}
Run Code Online (Sandbox Code Playgroud)
现在,我将讨论块中的编码for loop.
我可以使用这个迭代器访问和更改任何值.比如,我想将每个值增加10和打印.所以,代码将是:
*it+=10;
cout << *it << endl;
Run Code Online (Sandbox Code Playgroud)
我可以打印迭代器的地址和正在迭代的元素.
迭代器的地址可以通过以下方式打印:
cout << &it << endl;
Run Code Online (Sandbox Code Playgroud)
迭代元素的地址可以通过以下方式打印:
cout << &(*it) << endl;
Run Code Online (Sandbox Code Playgroud)
但是为什么迭代器本身不能通过执行以下操作来打印?
cout << it <<endl;
Run Code Online (Sandbox Code Playgroud)
起初我认为会议来自于JAVA考虑安全目的.但如果是的话,为什么我可以打印它的地址呢?
但是,有没有其他方法可以做到这一点?如果没有,为什么?
小智 12
是的,有办法做到这一点!
您无法打印迭代器,因为它未定义为具有值.但是你可以对它们执行arithematic操作,这有助于你打印(迭代器的)值.
请执行下列操作.
cout << it - v.begin();
Run Code Online (Sandbox Code Playgroud)
例:
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
using namespace std;
int main () {
vector<int> v = {20,3,98,34,20,11,101,201};
sort (v.begin(), v.end());
vector<int>::iterator low,up;
low = lower_bound (v.begin(), v.end(), 20);
up = upper_bound (v.begin(), v.end(), 20);
std::cout << "lower_bound at position " << (low - v.begin()) << std::endl;
std::cout << "upper_bound at position " << (up - v.begin()) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出上面的代码:
lower_bound at position 2
upper_bound at position 4
Run Code Online (Sandbox Code Playgroud)
注意:这只是一种完成工作的方法,我没有声称我们可以打印迭代器.
...
标准迭代器没有预定义的输出运算符,因为没有打印迭代器的常规含义。您希望这样的操作打印什么?虽然您似乎期望看到迭代器引用的对象的地址,但我发现根本不清楚。
对此没有统一的答案,因此委员会决定不添加这些运算符。(后半句是猜测,我不是委员会的成员。)
如果你想打印这些迭代器,我会定义一个类似的函数print(Iterator);(或类似的东西,只要适合你的需要)来完成你想要的事情。operator <<由于上面提到的原因, 我不会添加for 迭代器。