如何使用迭代器从对象列表中返回指向对象的指针

How to return Pointer to a object from List of objects using iterators

本文关键字:对象 指针 返回 列表 何使用 迭代器      更新时间:2023-10-16

当我遍历一个对象列表时,当迭代器指向某个对象时,我必须返回指向该对象的指针,我该怎么做?简而言之,人们能说出我应该用什么来代替吗???

#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;

在堆上创建对象,取消对它们的引用,将值放在堆栈上,然后返回指向这些对象的指针,这样做毫无意义。