如何打印c ++中的迭代器?

时间:2015-07-22 21:58:18

标签: c++ iterator

假设,我在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,考虑到安全目的。但如果是的话,为什么我可以打印它的地址?

然而,还有其他办法吗?如果没有,为什么?

4 个答案:

答案 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)

您不能打印迭代器,因为它没有被定义为具有值。但是您可以对它们执行算术运算,这有助于您打印(迭代器的)值。