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

Ena*_*san 10 c++ iterator

假设,我已经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)

注意:这只是一种完成工作的方法,我没有声称我们可以打印迭代器.

...

  • 这必须是公认的答案.这些算术在迭代器上的复杂性是多少? (2认同)
  • 它不适用于双链表中的所有迭代器:[简单迭代器差异上的“与运算符不匹配”错误](/sf/ask/2083497601/简单迭代器差异) (2认同)
  • `std::distance(it, v.begin())` 适用于例如 std::map,根据 Thomas Matthews 对另一个答案的评论。 (2认同)

Bau*_*gen 4

标准迭代器没有预定义的输出运算符,因为没有打印迭代器的常规含义。您希望这样的操作打印什么?虽然您似乎期望看到迭代器引用的对象的地址,但我发现根本不清楚。

对此没有统一的答案,因此委员会决定不添加这些运算符。(后半句是猜测,我不是委员会的成员。)

如果你想打印这些迭代器,我会定义一个类似的函数print(Iterator);(或类似的东西,只要适合你的需要)来完成你想要的事情。operator <<由于上面提到的原因, 我不会添加for 迭代器。

  • 距开头的偏移量或距离可能更有用,例如“std::distance(it,numbers.begin())”。 (3认同)
  • @manetsus 不是没有再次遍历整个列表来找到你的迭代器,一边计数。请注意,仅在迭代器内保留计数器是行不通的,因为您可以在迭代时从列表中删除对象。在 C++ 中避免了如此繁重但收益甚微的功能。我不了解Java(我也不知道你为什么一直提起它)。 (2认同)