什么是容器/适配器? C ++

时间:2010-10-06 14:52:36

标签: c++ stl containers adapter

什么是容器/适配器

有人请用外行人的语言解释。

我试图在互联网上查找,但定义和解释太技术化,难以理解。

我具有C ++及其子主题的基本知识,如(class / templates / STL)。

编辑1:

有谁能请给我一个容器/适配器应用的实际例子?

只是为了更好地理解:-)

谢谢。

3 个答案:

答案 0 :(得分:66)

容器是包含数据的特定数据结构,通常是无限量的。每种容器类型都有限制如何有效地访问,添加或删除数据。

以下是使用STL类的容器的一些示例。

序列容器

以下是序列容器,这意味着数据是可靠排序的(也就是说,它们有正面和背面。我并不是说它们会自动排序!)。

  • vector 有点像灵活大小的数组。向量是随机访问,这意味着您可以在恒定时间内访问具有整数索引的任何元素(就像数组一样)。您也可以在(几乎)恒定时间内从数组末尾添加或删除。但是,在其他任何地方,你可能都在考虑不得不重新复制所有元素。
  • deque 或双端队列就像一个向量,但您可以添加到正面或背面。您仍然可以在固定时间内访问元素,但是deque元素不能保证在内存中像矢量或数组一样连续。
  • 列表是一个链表,表示通过指针链接在一起的数据。您可以实时访问开头和结尾,但为了在中间的任何位置,您需要遍历列表。但是,如果已经有一个指向附近节点之一的指针,则可以在常量时间内在列表中的任何位置添加元素。

关联容器

这些是关联容器,意味着元素不再有序,而是相互关联,用于确定唯一性或映射:

  • 是具有唯一元素的容器。您只能将每个元素中的一个添加到集合中;任何其他添加都会被忽略。
  • multiset 就像一个集合,但你可以放入一个以上的元素。多重集合会跟踪结构中每种元素的数量。
  • map ,也称为关联数组,是一种插入键值对的结构;然后你可以通过提供密钥来查找任何值。所以它有点像一个数组,你可以使用字符串索引(键)或任何其他类型的索引访问。 (如果您插入另一个键值对并且该键已存在,则只需覆盖原始键的值。)
  • multimap 是一个允许为同一个键插入多个值的地图。当您执行密钥查找时,您将获得一个包含其中所有值的容器。

容器适配器

另一方面,容器适配器是通过限制预先存在的容器中的功能并提供不同的功能集来创建的接口。声明容器适配器时,可以选择指定哪些序列容器构成基础容器。这些是:

  • 堆栈是提供后进先出(LIFO)访问权限的容器。基本上,您按照插入它们的相反顺序删除元素。很难找到中间的任何元素。通常这是在 deque 之上。
  • 队列是提供先进先出(FIFO)访问的容器。您可以按插入顺序删除元素。很难找到中间的任何元素。通常这是在 deque 之上。
  • priority_queue 是一个提供对元素的排序顺序访问的容器。您可以按任何顺序插入元素,然后随时检索这些值中的“最低”值。 C ++ STL中的优先级队列在内部使用堆结构,而堆结构基本上是阵列支持的;因此,通常这会在 vector 之上。

有关详细信息,请参阅this reference page,包括每个操作的时间复杂性以及每个容器类型详细页面的链接。

答案 1 :(得分:55)

<joke> C ++是技术性的,难以理解:-D </joke>

容器是STL中可以包含数据的数据类型。

示例:vector作为动态数组

适配器是来自STL的数据类型,它调整容器以提供特定的接口。

示例:stack在所选容器顶部提供堆栈接口

(旁注:两者实际上都是模板而不是数据类型,但定义看起来更好)

答案 2 :(得分:6)

来自The SGI STL documentation的“容器”的技术定义相当不错:

  

Container是一个存储其他对象(其元素)的对象,它具有访问其元素的方法。特别是,作为Container模型的每个类型都有一个关联的迭代器类型,可用于迭代Container的元素。

因此,容器是一种数据结构,它包含(“包含”)某种类型的对象集合。关键的想法是有不同类型的容器,每个容器以不同的方式存储对象并提供不同的性能特征,但它们都有一个标准的接口,这样你就可以轻松地换一个容器而不需要修改太多使用容器的代码。我们的想法是,容器的设计应尽可能互换。

容器适配器是提供容器功能子集的类,但可以提供其他功能,以便在某些情况下更容易使用容器。例如,您可以轻松地将std::vectorstd::deque用于堆栈数据结构,并将push_backbackpop_back作为堆栈接口调用; std::stack提供了一个界面,可以使用std::vectorstd::deque或其他序列容器,但提供更标准的pushtoppop用于访问成员的成员函数。