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

时间:2014-03-28 14:42:04

标签: c++ list pointers

当我遍历一个对象列表时,当我有一个指向它的迭代器时,我必须将指针返回到我的一个对象,我是怎么做到的?简而言之,我可以告诉我应该把它放在什么地方?

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

5 个答案:

答案 0 :(得分:6)

您可以从迭代器获取指针,如下所示:

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

答案 1 :(得分:1)

你应该做的是取消引用迭代器并找到它的地址。

return &(*itr);

如果可以,您还可以更改代码以返回迭代器而不是原始指针。

答案 2 :(得分:1)

将对象添加到列表中的代码会泄漏内存,这是不必要的低效率。请改用

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

如果从列表中删除该节点,则指针变为无效。

答案 3 :(得分:0)

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

答案 4 :(得分:-4)

您的列表应该是指向Node的链接列表。

list<Node*> mylist;

执行诸如在堆上创建对象,取消引用它们并将值放在堆栈上然后返回指向这些对象的指针之类的事情是没有意义的。