2011-07-04 141 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提供的容器适配器不支持迭代中,因为它们限制了接口,以符合特定的模型:

  • 甲堆可以仅在一端
  • 在被操纵您可能只能在一端推送队列并从另一端检索队列

但是,这不是一个规则,您可能会决定创建支持迭代的适配器。