在指针集上使用迭代器来调用它的指针对象方法

时间:2016-02-08 19:05:58

标签: c++ pointers iterator set

我是一名初学者,因为我正在使用迭代器,并希望迭代我的点的名称将它们打印出来。我不知道如何访问它们,请帮我一个想法。我的方法看起来像这样:

 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;

2 个答案:

答案 0 :(得分:1)

下面循环中的

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参考:

What is a smart pointer and when should I use one?

Is it a good practice to always use smart pointers?

When should I use raw pointers over smart pointers?

答案 1 :(得分:0)

使用

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
}