2013-03-18 61 views
2
std::list<Value> stdList; 

stdList.push_back(Value()); 

Value * ptr = &stdList.back(); // <-- what will this address point to? 

如果我參加由back()返回的引用和隱式轉換到少通用Value *,將其指向列表的最後一個值之間的轉換,還是會指向某個地方意外?指針和引用

有沒有辦法從一個指針創建一個迭代器,用於std :: list函數,如erase()?我認識到通用指針(指向指針的迭代器)遠比其他方向更可行,但我認爲我會問。

+0

請注意,'stdList.back()'不返回迭代器,它返回對元素的引用。你在想'stdList.rbegin()'嗎? – Xymostech 2013-03-18 02:09:24

+0

@Xymostech - 哦,我的錯誤。我稍後問了另一個問題,其中一位評論者將返回值描述爲迭代器。所以我想我只是下意識地把它挑起來了。我會解決這個問題 – 2013-03-18 02:18:01

回答

2

指針將指向存儲在容器內的值。參考做了同樣的事情。

您不能直接將該指針轉換爲列表迭代器,因爲您已經丟失了有關周圍結構的所有信息。要做到這一點,你必須巧妙地與list::find

你正在嘗試做什麼有時使用vector完成。您可以將vector數據元素指針變爲迭代器(數組索引)的原因是因爲您知道vector的結構。

請注意list::back()確實不是返回一個迭代器。它返回一個參考。這兩者完全不同。你在想關於list::end()?還是你真的在迭代器和引用之間混淆?因爲你可以從得到一個指針的引用。你這樣做:

Value& refval = *ptr; 
1

是的,指針指向存儲在列表中的最後一個值。

我們不能從指針創建迭代器,迭代器是容器的概念(此處列表),迭代器不關心列表中存儲的是什麼類型的值。 引用和指針是存儲在列表中的值的句柄,它們是可互換的,我們可以將引用轉換爲指針,反之亦然。