2013-05-05 123 views
0

我有一個類,我已經聲明列表數組作爲數據成員。動態初始化和使用C++ STL列表數組

list <int> **listOfNodes; 

我已經在類的構造函數分配空間的指針列表如下(這裏「V」是否定的。名單我想,傳遞給構造函數作爲參數。)

listOfNodes=new list<int>* [v]; 
for (int i = 0; i < v; ++i) 
{ 
    list<int> temp; 
    listOfNodes[i]=&temp; //declaring a new list and making the list pointer point to it 
} 

現在我在函數內部有下面的代碼,用於從用戶處獲取輸入並將其添加到相應的列表中。例如,如果用戶輸入2 5,我需要將新條目5 push_back到索引爲2的列表中,即listOfNodes [2]指向的列表。

int u,v; 
cin>>u>>v; 
(*(listOfNodes[u])).push_back(v); 

但是,不知何故,我的代碼崩潰執行。 有人可以指出我可能做錯了什麼。

+1

問題在於,您正在使用指向'std :: list '的指針指針。我建議使用'std :: vector'(s)來代替。 – juanchopanza 2013-05-05 10:24:00

回答

2
for (int i = 0; i < v; ++i) 
{ 
    list<int> temp; 
    listOfNodes[i]=&temp; 
} // <- each temp is destructed here. 

您的temp列表會自動分配。這意味着一旦你走出循環範圍,它們將被銷燬。現在你的listOfNodes[i]指向一些被破壞的內存(可能它們指向相同的位置,因爲編譯器每次都在同一地址繼續分配temp,儘管如此,仍是無效的。))。

你應該做的,而不是像

for (int i = 0; i < v; ++i) 
{ 
    listOfNodes[i] = new list<int>; 
} 

而且不要忘了delete的dynmaically分配的內存。您應該只使用列表/列表向量或使用smart pointers的列表來代替。

+1

非常感謝@Named。我幾個小時都在爲此苦苦掙扎。是的,我也想過在後面使用列表向量,但想知道這段代碼有什麼問題。還會閱讀關於智能指針。再次感謝這樣一個快速回復和增加的建議。 :)關於我的第一個問題,我非常感動(除了我對SO已經提出的要求,對幫助我數十億次)的尊重。如果我有一定的聲望,肯定會有提高。 – Shobhit 2013-05-05 10:38:48

+0

@Shobhit :)沒問題的人。我很高興它有幫助。不要擔心upvote。我已經有兩個了。這是足夠的:) – stardust 2013-05-05 10:40:38

+0

誰一直低調我的答案?我真的不明白。你能否提一下爲什麼? – stardust 2013-05-05 10:54:09

2

避免將C++容器(list,vector,set,...)與C容器(普通數組)混合使用。如果你想保留一些列表的使用向量:

std::vector<std::vector<std::list<int>>> nodes; 

,而不是

std::list<int>** listOfNodes; 

這是非常繁瑣的手工跟蹤列表實例(正是你有經驗)。因此,讓矢量(或其他任何您認爲合適的,std::array可能更容易取決於您的情況)適當處理列表實例。

+0

謝謝@bitmask提供有用的建議。是的,後來我確實想到了使用你所建議的列表向量,但是想弄清楚我最初代碼中的漏洞。再一次,如果我有一些聲望,肯定會得到高票。 – Shobhit 2013-05-05 10:46:08

+0

哈哈「C容器」。幾乎不。 – rubenvb 2013-05-05 10:52:02

+0

@rubenvb:我知道這是一個奇怪的表述,但我想指出,如果你想要一個矢量風格的容器,數組就是你必須在C中使用的東西。在這方面,'int []'不是一個慣用的C++容器(但隱喻不應該拉得太多,我同意)。 – bitmask 2013-05-05 11:03:32