对指针集使用迭代器来调用其指针对象方法
Using iterator over set of pointers to call it's pointer object methods
我是使用迭代器的初学者,并希望遍历打印出的点的名称。我不知道如何访问它们,请帮我一个想法。我的方法如下所示:
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
}
- 为什么使用 "this" 指针调用派生成员函数?
- 当使用通配符和null指针调用函数时,对输出的说明
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 使用基类指针调用基类的值构造函数的语法是什么?
- 是否可以使用函数指针调用虚拟析构函数?
- 使用C++指针调用 python 函数
- 如何使用接口指针调用方法,该指针是其具体类的一部分,而不是接口的一部分
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 通过指针调用模板类成员函数 [为什么这是有效的 c++]?
- 从带有参数的基函数指针调用基方法
- 使用唯一指针调用函数会使我的程序崩溃
- C++::在构造函数退出之前通过指针调用成员函数
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 什么时候用指针调用C++类构造函数
- C++ - 使用变量指针调用函数
- 为什么我可以通过野生指针调用成员函数
- 从指针调用方法时出现分段错误
- 为什么使用指向函数的指针调用虚函数时不需要指针"this"?
- C++ abort() 在函数内的抽象类对象指针调用上