如何使用迭代器从对象列表中返回指向对象的指针
How to return Pointer to a object from List of objects using iterators
当我遍历一个对象列表时,当迭代器指向某个对象时,我必须返回指向该对象的指针,我该怎么做?简而言之,人们能说出我应该用什么来代替吗???
#include <iostream>
#include <list>
using namespace std;
class Node
{
private:
int name;
public:
Node() : name(0) {}
Node(int n) : name(n) {}
int getName() {return name;}
void setName(int n) {name = n;}
};
list<Node> mylist;
Node* getNodeObjectPointer(int n)
{
Node* toBeReturned = NULL;
for(list<Node>::iterator it=mylist.begin(); it != mylist.end(); it++)
{
if(((*it).getName()) == n)
toBeReturned = ???
}
return toBeReturned;
}
int main()
{
Node* a = new Node(1);
mylist.push_back(*a);
Node* b = new Node(2);
mylist.push_back(*b);
Node* myPointer = getNodeObjectPointer(1);
return 0;
}
您可以从迭代器中获得指针,如下所示:
Node* getNodeObject(int n)
{
for (list<Node>::iterator it = mylist.begin(); it != mylist.end(); it++) {
if ((it->getName()) == n)
return &*it; // this is the key, if you really want a pointer
}
return NULL;
}
但我会返回一个引用(在找不到时抛出异常(。您甚至可以直接返回迭代器。或者使用std::find
…
相关,这像筛子一样泄漏:
Node* a = new Node(1);
mylist.push_back(*a);
只需写:
Node a(1);
mylist.push_back(a);
甚至:
mylist.push_back(Node(1));
您应该做的是取消引用迭代器并找到它的地址。
return &(*itr);
如果可以的话,您还可以更改代码以返回迭代器而不是原始指针。
将对象添加到列表的代码会泄漏内存,而且效率不必要。使用此替代
mylist.push_back(Node(1));
mylist.push_back(Node(2));
你的功能应该是
Node* getNodeObjectPointer(int n)
{
Node* toBeReturned = NULL;
for(list<Node>::iterator it=mylist.begin(); it != mylist.end(); it++)
{
if(((*it).getName()) == n)
{
toBeReturned = &*it;
break;
}
}
return toBeReturned;
}
如果从列表中删除该节点,则指针将变为无效。
Node* getNodeObjectPointer( int n )
{
list<Node>::iterator it = mylist.begin();
while ( it != mylist.end() && it->getName() != n ) ++it;
return ( it == mylist.end() ? NULL : &*it );
}
如果你在主中写,它会更好更简单
int main()
{
mylist.push_back( 1 );
mylist.push_back( 2 );
Node* myPointer = getNodeObjectPointer(1);
return 0;
}
成员函数getName
也应声明为
int getName() const {return name;}
您的列表应该是指向Node
的指针列表。
list<Node*> mylist;
在堆上创建对象,取消对它们的引用,将值放在堆栈上,然后返回指向这些对象的指针,这样做毫无意义。
相关文章:
- 对象指针在c++中是如何工作的
- C++ 对象指针数组的复制构造函数
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 正确初始化和销毁对象指针的C++数组?
- 如何深度复制链表对象指针
- 对象指针 c++ 的全局向量错误
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 静态对象指针
- 正在将对象指针数组初始化为NULL
- 如何使用条件表达式返回对象指针?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 使用C对象指针构建PyObject*
- 如何在使用对象指针时访问成员函数
- 静态强制转换允许转换对象指针,但不允许转换整数
- C++ abort() 在函数内的抽象类对象指针调用上
- 指向函数的对象指针
- 访问指向对象指针向量的指针的第一个元素?
- 如何将对象/指针正确存储到 Qlist 中
- 对象指针打印结果以相反的顺序进行