set<T> 容器的成員返回的疊代器都是雙向疊代器。這些疊代器的型別的別名定義在 set<T> 模板中,可以從 set 中得到型別別名有 iterator、reverse_iterator、const_iterator、 const_reverse_iterator,從它們的名稱就可以看出它們的型別。例如:
-
成員函數 begin() 和 end() 會返回 iterator 型別的疊代器;
-
成員函數 rbegin() 和 rend() 會返回 reverse_iterator 型別的疊代器;
-
成員函數 cbegin() 和 cend() 會返回 const_iterator 型別的疊代器。
-
成員函數 crbegin() 和 crend() 可以返回 const_reverse_iterator 型別的疊代器。
然而,set 容器的疊代器型別的別名有時會讓人產生一些誤解。所有 set<T> 容器的成員函數返回的疊代器都指向 const T 型別的元素。因此,iterator 疊代器會指向 const 元素, reverse_iterator 和其他型別的疊代器也是如此。這意味著我們不能修改元素。如果想要修改 set 容器中的元素,必須先刪除它,然後再插入修改後的版本。
仔細思考一下,其實這是不合理的。set 中的物件以它們自己作為鍵,物件在容器中的位置是通過比較物件決定的。如果可以修改元素,元素的順序就失效了,也會擾亂後面的存取操作。、
當必須修改元素而且仍然需要將它們組合到一個或多個 set 容器中時,還有一個方法可以做到這一點。可以在 set 容器中儲存指標,並且最好選擇智慧指標。當使用 set 容器時,通常會在它們中儲存 shared_ptr<T> 或 weak_ptr<T> 物件。
在 set 容器中儲存 unique_ptr<T> 物件沒有多少意義。因為容器中不存在和 unique_ptr<T> 物件匹配的獨立鍵,所以我們從來不會直接檢索元素。