我是一名初学者,因为我正在使用迭代器,并希望迭代我的点的名称将它们打印出来。我不知道如何访问它们,请帮我一个想法。我的方法看起来像这样:
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;
答案 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?
答案 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
}