2012-09-05 100 views
8

對於大多數容器,iterator類型爲容器中的值提供讀寫訪問權限,類型爲const_iterator提供只讀訪問權限。但是,對於std::set<T>,迭代器類型不能提供讀寫訪問權限,因爲修改集合中的值(可能)會中斷容器不變量。因此,在std::set<T>中,iteratorconst_iterator都提供只讀訪問權限。std :: set :: iterator和std :: set :: const_iterator之間是否存在操作差異?

這使我想到我的問題:你可以用std::set<T>::iterator做什麼和你可以用std::set<T>::const_iterator做什麼有什麼不同?請注意,在C++ 11中,容器的操作方法(例如,erase)可能需要參數const_iterator

回答

6

不,它們之間沒有太大的功能差異。當然,使用回到C++ 03,當set<T>::iterator沒有返回const T&。但是一旦他們改變了它們,它們就會陷入兩種不同的迭代器,它們都會做同樣的事情。

事實上,標準很清楚,它們具有相同的功能(至可以是是相同的類型,但不是必需的)。從23.2.4,p。 6:

iteratoriterator是關聯容器的雙向迭代器類別。對於值類型與密鑰類型相同的關聯容器,iteratorconst_iterator都是常量迭代器。未詳細說明iteratorconst_iterator是否是相同的類型。 [注意:iteratorconst_iterator在這種情況下具有相同的語義,並且iterator可轉換爲const_iterator。用戶可以通過在其功能參數列表中始終使用const_iterator來避免違反One Definition Rule。 - 注完]

1

當我們(ERR I)移植我們的大型應用VC 10.0,這條規則拿了影響。它打破了人們通過調用非const方法操縱迭代器的各種舊代碼。

因此,這導致了我發現的最大區別:您只能在const迭代器上調用const方法。在舊標準中,你可能無法調用非const方法並搞亂你的設置。在某些情況下,我最終用map更換了一些設置,我發現代碼絕對需要修改存儲在容器中的項目。

希望有所幫助。

相關問題