打印正在返回的迭代器

时间:2016-01-10 11:35:30

标签: c++ templates iterator

我在尝试打印出正在返回的迭代器时遇到了一些困难。我试图创建两个带有一些值的迭代器,然后返回遇到该值的迭代器。这是我的代码:

#include <iostream>
#include <vector>
using namespace std;

template <typename Iterator, typename T>
Iterator find_elem(Iterator &first, Iterator &last, const T &obj){
    while(first != last && (*first) != obj){
        ++first;
    }
    return first;
}

int main() {
  vector<int>::iterator one;
  vector<int> a = {3,4,5,6,7};
  vector<int>::iterator two;
  vector<int> b = {5,6,7,8,9};
  cout << find_elem(one, two, 9); // ERROR ON THIS LINE

  return 0;
}

如果有人可以帮助解决这个问题,我会非常感激,因为这样可以更好地帮助我详细了解迭代器

2 个答案:

答案 0 :(得分:1)

虽然迭代器确实没有被初始化,这是错误,但这不是编译器错误的原因。

编译器错误是由于误解造成的。你希望能够&#34; print&#34;与任何其他指针一样,std::cout的迭代器。

问题是迭代器不是指针。这是一个独立的课程。您不能打印迭代器,只能打印任意类的实例。这也不会起作用,例如:

class MyVeryFineClass {
public:
     MyVeryFineClass() {}
};

MyVeryFineClass exists;

std::cout << exists;

这也不会起作用,至少在我自己operator<<定义std::ostream之前,以及我非常好的班级的实例之前。

这就是为什么你不能采取

std::vector<int>::iterator p;

并希望这可行:

std::cout << p;

因为迭代器不是指针,而std::ostream对它没有任何了解,当然不会比任何其他任意类更多。

你可以用大多数迭代器来做到这一点:

std::cout << &*p;

通过解除引用迭代器,你得到一个内容的左值,它的地址通常是&#34;打印&#34;到std::ostream。所以,在你的情况下,它将是:

cout << &*find_elem(one, two, 9); // No more errors on this line.

答案 1 :(得分:1)

请在代码中的评论部分查看我的答案。 这是你问题的工作代码。

#include <iostream>
#include <vector>
using namespace std;

template <typename Iterator, typename T>
Iterator find_elem(Iterator &first, Iterator &last, const T obj){
    //compare the value (after dereferencing the iterator)
    //can not comapre two iterator from two different container
    while(*first != *last && (*first) != obj){
        ++first;
    }
    return first;
}

int main() {
 //insert using push_back()
  vector<int> a;
  a.push_back(3);
  a.push_back(4);
  a.push_back(5);
  a.push_back(6);
  a.push_back(7);
  vector<int>::iterator one = a.begin();

  vector<int> b;
  b.push_back(5);
  b.push_back(6);
  b.push_back(7);
  b.push_back(8);
  b.push_back(9);
  //Initialize the iterator one and two with the first value of the containers
  vector<int>::iterator two = b.begin();
  //dereference the returned iterator 
  cout << *(find_elem(one, two, 9)); // ERROR ON THIS LINE

  return 0;
}