[英]How does an STL container of iterators behave?
這個問題在我看來是出於學術興趣,而不是實際的用例:
STL關聯容器,即[多]集和[多]映射,包含重載方法,如:
// for std::map
void erase ( iterator position );
size_type erase ( const key_type& x );
// for std::set
iterator erase (const_iterator position);
size_type erase (const value_type& val);
我的問題: 如果key_type
,resp。 value_type
是iterator
還是const_iterator
?
我知道將迭代器存儲在容器中是危險的並且可能沒用。 但是實際的STL實現會如何表現? 行為甚至定義了嗎?
問題是迭代器類型會有所不同。 不可能它們是相同的。 原因是:在這種情況下必須遵循以下平等:
map<K, V>::iterator == K
map<K, V>::const_iterator == K
但是,這些等式無法保持(你看到遞歸)嗎? 請記住,迭代器類型取決於容器類型,包括其模板參數。
因此,在下面的示例中,鍵類型和迭代器類型是不同的,只要您嘗試使它們相等:
map<map<int,int>::iterator, int> i;
實際上,由於上面的原因,我無法實例化一個鍵等於其迭代器類型的映射。 因此,重載的erase
方法如下所示:
void erase ( map<map<int,int>::iterator, int>::iterator position );
size_type erase ( const map<int,int>::iterator & x );
因此,重載永遠不會是模棱兩可的。 如果類型相同,那就不明確了,請看: http : //ideone.com/fMdwru 。 但是,只要您使用該方法,編譯器就會抱怨。 所以,假設我們可以在這里引入歧義,只要我們想要使用該方法,它只會困擾我們。 我的意思是,我們仍然可以實例化地圖類型(如果它存在)。
將迭代器存儲在容器中沒有任何內在錯誤。 需要注意的兩個主要問題是:
我的問題:如果
key_type
,resp。value_type
是iterator
還是const_iterator
?
如果所有四種類型都引用相同的容器類型,則答案是根據定義它們不能相同。
這樣做沒有錯,也沒用。 :)
記住迭代器基本上只是泛化指針。 如有疑問,請假設它們的行為類似於指針。 您可以創建指針容器,因此您也可以創建迭代器容器。
當然,您必須記住,如果您修改容器,指向該容器的迭代器可能會失效(取決於執行的操作和容器的類型),但這只是意味着您必須知道存儲的迭代器保持不變有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.