簡體   English   中英

迭代器的STL容器如何表現?

[英]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_typeiterator還是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 但是,只要您使用該方法,編譯器就會抱怨。 所以,假設我們可以在這里引入歧義,只要我們想要使用該方法,它只會困擾我們。 我的意思是,我們仍然可以實例化地圖類型(如果它存在)。

將迭代器存儲在容器中沒有任何內在錯誤。 需要注意的兩個主要問題是:

  1. 您可能需要知道每個迭代器引用的容器;
  2. 您必須知道原始容器上的哪些操作將使哪些迭代器無效。

我的問題:如果key_type ,resp。 value_typeiterator還是const_iterator

如果所有四種類型都引用相同的容器類型,則答案是根據定義它們不能相同。

這樣做沒有錯,也沒用。 :)

記住迭代器基本上只是泛化指針。 如有疑問,請假設它們的行為類似於指針。 您可以創建指針容器,因此您也可以創建迭代器容器。

當然,您必須記住,如果您修改容器,指向該容器的迭代器可能會失效(取決於執行的操作和容器的類型),但這只是意味着您必須知道存儲的迭代器保持不變有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM