未能使用vector迭代器,c++

Failing to use a vector iterator, c++

本文关键字:迭代器 c++ vector      更新时间:2023-10-16

我正在尝试迭代持有指向学生类型对象的指针的向量。vector的声明如下:static vector<Student*> students;

无论如何,我试图在函数pickWinners()中使用迭代器:

vector<Student*>::iterator p1 = students.begin();
vector<Student*>::iterator p2 = p1;
p2++;

据我所知,p1是指向Student指针的指针。但是当我尝试这个(例如):

*p1->print();

我得到下一个错误:

雇工。cpp:192:错误:请求成员' print ' in ' * p1.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator-> with _Iterator = Student**, _Container = std::vector> ',非类类型' Student* 'make: *[雇用;0]错误1

这对我来说毫无意义。我知道问题不在印刷()。I tried

Student *student = students.at(0);
student->print();

一切都很顺利。我一点头绪都没有,有什么主意吗?谢谢!

使用

(*p1)->print();

在您的示例中,代码解析为*(p1->print());,因为operator->具有比operator*更高的优先级,例如,参见wikipedia上的优先级表

您可能想要/需要(*p1)->print(); as -is,它会像您编写的*(p1->print());一样解析

存储Student s而不是Student * s的可能性是20:1。

一旦你解决了这个问题,你可能想要摆脱Student::print(),而提供std::ostream &operator<<(std::ostream &, Student const &);。设置好之后,您可以执行如下操作:

std::cout << *p1;

和(例如)打印整个数组的结果如下:

std::copy(students.begin(), students.end(), 
          std::ostream_iterator<Student>(std::cout, "n"));

p1是一个迭代器,对于优先级规则,编译器将其解释为:

*(p1->print());

但是你想要的是:

(*p1)->print();