【问题标题】:Using iterator over set of pointers to call it's pointer object methods在一组指针上使用迭代器来调用它的指针对象方法
【发布时间】:2016-02-08 19:05:57
【问题描述】:

我是使用迭代器的初学者,我想遍历我的点的名称并将它们打印出来。我不知道如何访问它们,请帮我出一个主意。我的方法是这样的:

 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 会为您提供元素。在你的情况下,所有的变化是这个元素是一个指针,我假设你知道如何使用指针。容器中指针的一般规则没有例外,您需要停止编造它们。
  • 这里似乎有些混乱。实际使用的是CPtr 还是Ptr?第 2 行和第 3 行与问题无关。

标签: c++ pointers iterator set


【解决方案1】:

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

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());
}

再修改:

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

错了。迭代器设置为 iterator 指向集合的第一个元素。正如@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?

【讨论】:

  • 谢谢,语法错误是我尝试进入对象方法的糟糕尝试。工作正常,谢谢! get() 在循环中的作用是什么?这是我缺少的一个主要概念。
  • 编辑:我已将此解释移至答案中。
  • 回顾一下,get() 与实际的循环迭代机制完全无关。它只是您的容器存储的类的一个方法。
  • “收集开始”是什么意思? . begin() 将迭代器返回到我所理解的开头/开始。
  • 另外,您能否参考指针类的 get() 用法?我在谷歌上搜索了许多原始指针(缺点)优势的结果,但没有明确的例子。我为 Point::Ptr 编辑帖子
【解决方案2】:

使用

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 编译器,则可以使用 range-for 循环对其进行简化。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    相关资源
    最近更新 更多