2011-07-04 49 views
6

在上STL的C++文章之一,正在被表示, -容器適配器不支持迭代

由於容器適配器不支持迭代器,因此它們不能與STL算法使用。

但它沒有解釋爲什麼容器適配器不支持迭代器?任何人都可以解釋我嗎?

回答

6

堆棧或隊列有什麼重點?一個堆棧的定義是,你只能推入並彈出...迭代器將破壞這些適配器的全部用途

+2

+1。換句話說,容器迭代器的目的是將容器API限制爲棧/隊列/任何抽象所需的最小操作。迭代不是最低限度FIFO或LIFO的一部分。如果你想要一個可迭代的隊列,它的行爲與讀取的序列相似,但只能像隊列一樣進行變異,那麼要麼使用完整的容器接口(並且選擇不要調用'insert',只調用'push_back'),否則使用比std :: queue'更寬的接口編寫自己的容器適配器。 –

+0

那麼?暴露的操作集仍然是輸入和輸出迭代器的超集。大量的STL算法都適用於這些算法。例如。 'std :: copy'可以很好地用於推送堆棧上的項目。 – MSalters

+0

@ MSalters:'std :: copy'可以用來用'back_inserter'在堆棧上推送物品。堆棧不需要迭代器。任何需要棧上的迭代器*的操作都將超出LIFO棧的最小定義。如果迭代器暴露了棧操作的嚴格超集,那意味着最小棧接口公開迭代器是不合適的。 –

1

我會注意到,這只是一個觀察,而不是一個規則。

即,在STL提供的容器適配器不支持迭代中,因爲它們限制了接口,以符合特定的模型:

  • 甲堆可以僅在一端
  • 在被操縱您可能只能在一端推送隊列並從另一端檢索隊列

但是,這不是一個規則,您可能會決定創建支持迭代的適配器。