2015-02-11 95 views
0

據我瞭解,std :: vector在每次元素增長或收縮時分配/取消分配它所需的所有內存,因此指針運算可用於迭代向量元素。std :: list實現&指針arithemetic。

另一方面,std :: list使用雙鏈表,每個元素指向下一個和上一個元素。

假設(可能錯誤地)std :: list動態地分配它的內存,所以內存被分配,如果需要時,增量。 std :: list如何仍然能夠提供指針算術作爲迭代它元素的手段?

+2

'std :: list'不提供迭代的指針算法。 – juanchopanza 2015-02-11 19:59:19

+1

你能提供一個你認爲'std :: list'允許的例子嗎? – SirGuy 2015-02-11 19:59:43

+0

begin()返回一個iter,所以我假設我可以使用像iter ++這樣的運算符http://en.cppreference.com/w/cpp/container/list – tuk 2015-02-11 20:02:01

回答

3

粗略地說,您可以假設std::list::iterator是指向列表元素struct iterator { list::element *current };的指針的容器。而一個元素有指向下一個和上一個的指針,如struct element { list::element *next, *previous };當你遞增該迭代器時,它只是重新指定這個指針指向下一個元素。像鏈接列表中的it->current = it->current->next一樣。沒有涉及指針算術。

+0

@tuk它不是一個指針。假設它有什麼意義呢? – juanchopanza 2015-02-11 20:26:48

+0

我試圖實現我自己的std :: list版本來執行你所描述的操作,但是當我嘗試使用iter ++遞增迭代器時,它忽略了我的特殊列表操作符++函數,而是試圖使用指針運算....因爲迭代器是一個指針。我可以使它工作的唯一方法是增加列表對象本身,以便調用我的operator ++函數。 – tuk 2015-02-11 20:28:50

+1

迭代器不是一個指針。 在我的例子中,迭代器是一個結構,你必須按照描述重寫'operator ++'。運算符被重新定義爲_iterator_,而不是列表或列表元素。 – ftynse 2015-02-11 20:33:56