假设,我在C++
中声明了一个向量:
vector<int>numbers = {4,5,3,2,5,42};
我可以通过以下代码迭代它:
for (vector<int>::iterator it = numbers.begin(); it!=numbers.end(); it++){
// code goes here
}
现在,我将在for loop
的块中讨论编码。
我可以使用这个迭代器访问和更改任何值。比如,我想将每个值增加10和打印。所以,代码将是:
*it+=10;
cout << *it << endl;
我可以打印迭代器的地址和正在迭代的元素。
迭代器的地址可以通过以下方式打印:
cout << &it << endl;
迭代元素的地址可以通过以下方式打印:
cout << &(*it) << endl;
但是为什么迭代器本身无法通过执行以下操作来打印?
cout << it <<endl;
起初我认为会议来自JAVA
,考虑到安全目的。但如果是的话,为什么我可以打印它的地址?
然而,还有其他办法吗?如果没有,为什么?
答案 0 :(得分:11)
是的,有办法做到这一点!
您无法打印迭代器,因为未将其定义为具有值。
但是你可以对它们执行arithematic操作,这有助于你打印值( 迭代器 )。
执行以下操作。
cout << it - v.begin();
示例:
#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;
}
输出上述代码:
lower_bound at position 2
upper_bound at position 4
注意:这只是完成任务的一种方式,我没有声称我们可以打印迭代器。
...
答案 1 :(得分:3)
标准迭代器没有预定义的输出运算符,因为没有打印迭代器的常规含义。你期望这样的打印操作是什么?虽然您似乎希望看到迭代器引用的对象的地址,但我发现根本不清楚。
没有普遍的答案,因此委员会决定不添加这些运营商。 (后半句是猜测,我不是委员会的成员。)
如果你想打印那些迭代器,我会定义一个像print(Iterator);
这样的函数(或类似的东西,不管你需要什么),它能做你想要的。出于上面提到的原因,我不会为迭代器添加operator <<
。
答案 2 :(得分:1)
为什么迭代器本身不能通过执行以下操作来打印?
因为,它没有在内部定义为值。
还有其他办法吗?
基本上,默认情况下,编译器不支持它,您可以尝试编辑编译器代码!但是你知道这太棒了!
如果没有,为什么?
因为它没有明确的表达方式。
答案 3 :(得分:-1)
您不能打印迭代器,因为它没有被定义为具有值。但是您可以对它们执行算术运算,这有助于您打印(迭代器的)值。