2014-02-26 33 views
-1

採訪查詢:創建一個函數,該函數將返回函數內部創建的鏈表中的第一個節點;使用std :: list。返回在函數中創建的std :: list的第一個節點

std::list<int> function() 
{ 
    std::list<int> l; 
    l.push_back(1); 
    l.push_back(2); 
    l.push_back(3); 
    return l.front(); 
} 

這是正確的方法嗎?

編輯:問題是返回節點,而不是第一個節點的值。

+2

它,然後應該是'INT函數()'。 – user1810087

+0

這個問題似乎牽扯到兩個方向。通常鏈表中的節點不僅僅是包含的值(它還包括指向下一個節點的指針)。但std :: list將其實際節點類型隱藏爲實現細節,只允許您訪問所包含的值(在這種情況下,迫使您返回int,正如其他人所建議的那樣) –

+1

也許重點是測試您對本地變量(在堆棧上創建,在函數退出時銷燬)與分配(在堆上使用'new'創建,在函數退出後仍然存在)。返回一個迭代器到一個局部變量將是一個壞主意,因爲它不會存在迭代器被取消引用 –

回答

0

如果你只需要值,將其更改爲

int function() 
{ 
    ... 
} 
1

std::list公共接口未在節點和值來定義。它被定義爲類型爲value_type元件的容器。因此,您可以而不是訪問鏈接列表的「節點」,只有它的元素。

如果你想從本地std::list從一個函數返回的第一個元素,那麼你必須返回元素的副本,當函數體超出範圍的所有本地對象將被銷燬。

int func() { 
    std::list<int> l { 1, 2, 3 }; 

    return l.front(); // Return a copy of the first element. 
} // l gets destroyed here. 

這個採訪查詢的目的可能是檢查你是否瞭解本地對象生命週期的機制。

例如,您可以從函數內部返回一個引用或指針到本地自動對象:

int& func() { // Notice return type. 
    std::list<int> l { 1, 2, 3 }; 

    return l.front(); // Return a reference to the first element. 
} // l gets destroyed here. 

int main() { 
    const int& number = func(); // Dangling reference! 
    std::cout << number;  // The UB deamons come! 
} 
0

我不知道「採訪查詢」是否是一個笑話。下面的代碼在Visual Studio的工作原理:

struct Node // an assumption !! 
{ 
    Node* next_; 
    Node* prev_; 
    int data_; 
}; 

Node function() 
{ 
    std::list<int> l; 
    l.push_back(1); 
    l.push_back(2); 
    l.push_back(3); 
    Node** p = reinterpret_cast< Node** >(&l.front()); 
    return *reinterpret_cast< Node* >(p-2); 
} 

;-)

相關問題