在一组指针上使用迭代器来调用它的指针对象方法
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;
正在使用
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
}
下面循环中的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
的引用,但它似乎是一个指针 class。因此,要得到这个指针class的一个对象所存储的Point
对象,需要调用get()
。这个函数 returns 你一个 Point*
指针(也称为 原始指针 ),你可以像你总是使用指向 class 的指针一样使用它对象。简而言之,这是将原始指针包装成(或多或少)智能指针的常见概念的示例 classes.
参见:
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());
}
再编辑:
Normally for iterator in a loop it shall be set to the first element of the set.
错了。迭代器设置为 iterator 指向集合的第一个元素。正如@RSahu 在下面也指出的那样,您不能将容器元素分配给迭代器,这是 (a) 逻辑错误和 (b) 语法错误。而且,您可能希望从集合开始以外的位置开始迭代,因此 "to the first element" 部分也不完全正确。
还有一个供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?
我是使用迭代器的初学者,想遍历我的点名并将它们打印出来。我不知道如何访问它们,请帮我出出主意。我的方法是这样的:
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;
正在使用
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
}
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
的引用,但它似乎是一个指针 class。因此,要得到这个指针class的一个对象所存储的Point
对象,需要调用get()
。这个函数 returns 你一个 Point*
指针(也称为 原始指针 ),你可以像你总是使用指向 class 的指针一样使用它对象。简而言之,这是将原始指针包装成(或多或少)智能指针的常见概念的示例 classes.
参见:
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());
}
再编辑:
Normally for iterator in a loop it shall be set to the first element of the set.
错了。迭代器设置为 iterator 指向集合的第一个元素。正如@RSahu 在下面也指出的那样,您不能将容器元素分配给迭代器,这是 (a) 逻辑错误和 (b) 语法错误。而且,您可能希望从集合开始以外的位置开始迭代,因此 "to the first element" 部分也不完全正确。
还有一个供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?