2014-03-28 75 views
0

對象的列表返回一個對象時,我遍歷對象的列表,我必須返回指向我的對象之一,當我有一個迭代器,指向它,我該怎麼辦呢?總之,可以告訴我應該在什麼地方放?如何指針使用迭代器

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

聖內存泄漏 –

+0

爲什麼你們的名字號碼? –

+0

'節點(INT)'應註明,以便'explicit'避免討厭的驚喜 –

回答

1

你應該做的是取消引用迭代器並找到它的地址。

return &(*itr); 

如果你還可以改變代碼來返回迭代器而不是原始指針。

-4

你的名單應該是指針的列表Node

list<Node*> mylist; 

這是沒有意義的做這樣的事情在堆上創建對象,解引用他們,並把堆棧值,然後返回指向的對象。

+2

爲什麼不'名單'? –

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&hellip;


相關,這種泄漏像篩子:

Node* a = new Node(1); 
mylist.push_back(*a); 

只要寫:

Node a(1); 
mylist.push_back(a); 

甚至:

mylist.push_back(Node(1)); 
+0

甚至:'mylist.emplace_back(1);'。 – Shoe

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

如果從列表中刪除該節點,指針變爲無效。

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

你爲什麼混淆功能這麼多?目的是什麼?那麼,除了這種古怪之外,你的答案與現有的答案是一樣的。 –