c ++中序列容器和容器适配器之间的区别

时间:2011-09-09 11:55:31

标签: c++ stl containers

c ++中序列容器和容器适配器有什么区别?

这里我的意思是序列容器作为vector,deque,list而容器适配器作为stack,queue,priority_queue。 我们什么时候更喜欢序列容器和容器适配器?

4 个答案:

答案 0 :(得分:3)

序列是一种特殊类型的容器,其中元素的顺序与其值无关。相反,它是它们被附加到容器(或插入等)的顺序。

容器适配器根本不是容器,因为它不实现容器的接口(不提供迭代器等)。相反,它提供对容器的有限访问。标准库中提供的那些操作使用序列。

当您想要对对象集合进行有限访问时,可以使用容器适配器。堆栈和队列都只允许您在一端添加。此外,堆栈只允许您在写入的同一端读取/删除,而队列只允许您在另一端读取/删除。它们不执行序列尚未执行的任何操作,除了以阻止迭代所有元素,等等。

priority_queue的行为有点复杂,并且它确实添加了尚未成为序列一部分的行为。

答案 1 :(得分:3)

容器适配器使用包含来提供对序列容器功能的有限访问。许多容器适配器公共方法只是对这个非公共元素的调用的包装。如果您的应用程序可以使用容器适配器的有限功能,则最好使用容器适配器。

假设您刚刚使用其中一个序列容器来实现队列。您调用push_front添加到队列pop_back以从中删除。现在来了一些bozo维护者并调用pop_front而不是pop_back。如果您不希望某人弹出您打算用作队列或堆栈的错误的一端,请不要提供该功能。容器适配器故意不提供对底层序列容器的完全访问权。

另一方面,如果你需要深入了解(例如,你需要查看堆栈中的第二个元素),你将需要使用序列容器而不是适配器。您可能想要考虑使用适配器原理:不要导出容器的完整功能。只需导出真正需要的功能。

答案 2 :(得分:2)

您需要在需要堆栈时使用堆栈容器适配器,在需要队列时使用队列适配器,在需要优先级队列时使用priority_queue适配器。

如果您不确定何时需要这些:堆栈在一端增长和缩小,因此您可以将其用作累加器来存储中间结果(堆栈机器);使用队列以先进先出(FIFO)方式处理事物;优先级队列以定义的顺序弹出元素(例如,存储任务,然后按重要性顺序检索它们)。

答案 3 :(得分:2)

序列容器

您可以将序列容器视为“从头开始构建”的容器。他们使用不同的结构来保存数据,并具有不同的算法时间来插入,删除和检索元素。

您可以找到有关容器here

的算法时间的大量信息

容器适配器

容器适配器在序列容器上添加了行为,使它们尊重不同的范例。添加的行为可能是更严格的行为(堆栈将只允许您弹出/推送项目,没有随机插入)。它们是其他类型的容器,不需要那些已存在的新存储行为。例如,可以在向量上构建堆栈 。然后它将使用向量的数据结构,但将使用限制在某组函数中以模仿堆栈。

最重要的是确保您使用合适的容器以满足您的需求。更严格的容器将帮助您防止遗失数据,并且知道数据的使用将帮助您选择好的容器以获得最佳性能。

有关容器适配器的更多信息,请访问here

我大部分时间都应该使用什么?

许多专家(Scott Meyer,Bjarne Stroustrup)建议默认使用vector,而其他人(如Herb Sutter,Steve Jessop指出)建议使用deque。我强烈建议您选择最适合您需要的容器。