我在尝试打印出正在返回的迭代器时遇到了一些困难。我试图创建两个带有一些值的迭代器,然后返回遇到该值的迭代器。这是我的代码:
#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;
}
如果有人可以帮助解决这个问题,我会非常感激,因为这样可以更好地帮助我详细了解迭代器
答案 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;
}