对指针集使用迭代器来调用其指针对象方法

Using iterator over set of pointers to call it's pointer object methods

本文关键字:指针 调用 方法 对象 迭代器      更新时间:2023-10-16

我是使用迭代器的初学者,并希望遍历打印出的点的名称。我不知道如何访问它们,请帮我一个想法。我的方法如下所示:

 set<Point::Ptr> points = world->getPoints(); // have set of pointers to Point
 Point::CPtr myPoint = *points.begin(); // dereferenced iterator to the first element
 Point::CPtr lastPoint = *points.rbegin(); //dereferenced iterator to the last valid element
 for(set<Point::Ptr>::iterator it = *points.begin(); it != points.end(); it++) {
    ROS_INFO("points are: %s: ", myPoint.get()->getName().c_str());
 }

通常,对于循环中的迭代器,它应设置为集合的第一个元素。但是由于 set 包含指针,并且我希望能够调用可用于这些指针中的对象的函数,因此我尝试了这种方式。它仅适用于这样的一个元素,给我想要的名字:

ROS_INFO("myPoint pointer gives %s: ", myPoint.get()->getName().c_str());

编辑:typedef boost::shared_ptr CPtr;

下面

循环中的it是一个迭代器。因此,要访问它引用的元素,您需要取消引用它(*it(或使用成员访问运算符(it->(。

set<Point::Ptr> points = world->getPoints(); // have set of pointers to Point
for(set<Point::Ptr>::iterator it = points.begin(); it != points.end(); it++) {
   ROS_INFO("points are: %s: ", it->get()->getName().c_str());
   ROS_INFO("points are: %s: ", (*it).get()->getName().c_str());
}

这里还有一个拼写错误或故意的语法错误:

for(set<Point::Ptr>::iterator it = *points.begin(); it != points.end(); it++) {
//                                ^^^

您希望迭代器本身遍历循环,而不是它引用的值。

编辑:对于OP和未来的参考,从评论中移至此处:

我没有对Point::Ptr的引用,但它似乎是一个指针类。因此,要获取此指针类的对象存储的Point对象,您需要调用 get() 。此函数返回一个Point*指针(也称为原始指针(,然后您可以像始终使用指向类对象的指针一样使用该指针。简而言之,这是将原始指针包装到(或多或少(智能指针类中的常见概念的示例。

看:

for(set<Point::Ptr>::iterator it = points.begin(); it != points.end(); it++) {
   const Point::Ptr pointer= *it;
   ROS_INFO("points are: %s: ", pointer.get()->getName().c_str());
}

再编辑一次:

通常,对于循环中的迭代器,它应设置为集合的第一个元素。

错。迭代器设置为指向集合的第一个元素的迭代器。正如下面@RSahu指出的那样,您不能将容器元素分配给迭代器,这是 (a( 逻辑错误和 (b( 语法错误。而且,您可能希望从集合开始以外的位置开始迭代,因此"到第一个元素"部分也不完全正确。

还有一个供OP参考:

什么是智能指针,何时应使用?

始终使用智能指针是一种好习惯吗?

何时应使用原始指针而不是智能指针?

使用

for(set<Point::Ptr>::iterator it = *points.begin(); it != points.end(); it++)

是一个问题,因为it是一个迭代器,但*points.begin()不是。您需要使用:

for(set<Point::Ptr>::iterator it = points.begin(); it != points.end(); it++)
{
   Point::CPtr myPoint = *it;
   // Now you can use myPoint
}

如果您能够使用 C++11 编译器,则可以使用范围for循环来简化它。

for( auto myPoint : points)
{
   // Now you can use myPoint
}