C++中的class有什么条件可以成为容器?

What are the qualifications for a class in C++ to become a container?

我是 C++ 编程的新手,遇到了术语 containers 以及 vectordequemap 等示例

class 在 C++ 中被称为 container 的最低要求是什么?

C++ concepts: Container

A Container is an object used to store other objects and taking care of the management of the memory used by the objects it contains.

http://en.cppreference.com/w/cpp/concept/Container

A container is a holder object that stores a collection of other objects (its elements). They are implemented as class templates, which allows a great flexibility in the types supported as elements.

http://www.cplusplus.com/reference/stl/

鉴于这些定义,我认为我们可以说容器应该能够存储任意数量的元素(尽管该数量可以是编译时常量)。容器拥有它包含的对象,包括在堆或堆栈(对于 array 容器)中为它们分配 space。因此,程序员不需要 newdelete(分配或释放)对象的内存。

在STL中可以找到以下容器:array, deque, vector, set, map, stack, queue, list, unordered_map, unordered_set

容器通常允许您访问(或索引)它包含的元素,尽管有些只允许访问一个或几个元素(例如队列或堆栈)。容器将提供添加或删除对象或搜索对象的方法。

要求:

  • 必须容纳任意数量的对象
  • 它持有的对象是任意类型的(尽管它可能必须满足某些要求,例如可排序)

可能的功能

  • 虽然有些容器可以识别分配器,但并非必须如此。
  • 一个容器可以容纳不止一种类型的对象(例如地图,虽然地图可以被认为是容纳成对的对象)
  • 虽然容器可能是可迭代的,但这不是必需的,例如。队列或堆栈。

类 是容器

  • std::string:这是一个字符集合。虽然是为字符或宽字符设计的,但它是 SequenceContainer

有些 class 不会被视为容器:

  • std::unique_ptr, std::shared_ptr:虽然这些类型有所有权的概念,但它们只管理 1 个对象,所以它们不是一个对象集合
  • std::tuple,std::pair:虽然元组可以容纳任意数量的对象,但需要指定每个对象的类型,因此它不'具有一般容器所应有的灵活性。元组可以更准确地归类为一种结构。

我将从范围概念开始。

Range 只有两种方法 -- begin 和 end。它们都是 return 相同类型的迭代器(注意:有建议允许结束到 return 哨兵)。

假定 reader 理解迭代器。

一个高质量的Range也可以暴露empty, size, front, back, and operator [](尤其是随机访问)。

对于 for(:) 循环,您可以通过成为原始 C 数组、具有 begin()end() 方法或在与您的类型相同的名称空间,将您的类型作为一个参数(和 return 类似迭代器的东西)。从这个 post 开始,标准中唯一消耗范围的是 for(:) 循环。有人可能会争辩说 this answer 是 C++ 中范围概念的唯一实用定义。


接下来,容器。

一个容器是一个拥有其元素的至少前向迭代器的范围(输入和输出范围通常不称为容器)。顺序容器和关联容器是不同的野兽,两者都在标准中定义。

标准中的容器有一组类型定义——值类型、迭代器、常量迭代器。大多数也有分配器(数组除外)。它们是空的,大多数都有尺寸(forward_list除外)。

容器都可以由 2 个输入或前向迭代器构造为兼容的值类型,并从初始化列表构造。

顺序容器有向后推送和放置(向前列表除外)(有些有 emplace/push 前面),并在迭代器处插入和放置(或向前列表之后)。

关联容器有一个键类型。其中许多是成对的容器。存储的数据通常是部分 const(数据的 "key" 部分,在 sets 的情况下是键或整个字段)。他们有插入和放置有和没有提示——他们管理自己的订单。他们还有 .find.count 方法。

std 库中目前没有依赖于 Container-ness 的函数。并且有一个积极的提议,将 Container-ness 和 Range-ness 形式化为 C++17 中的一个概念。 Container 的实际技术定义在标准中,以防您需要准确创建实际容器;但是,通常您确实需要一个具有编辑方式和所有权机制的范围。以我的经验,容器的概念主要是为了在标准中更容易指定行为。

添加Ranges-v3之类的东西后,Range和Container的概念将是实际存在于代码中的东西,并且可能会有完全依赖于这些特性的算法。在此之前,它们更像是临时概念。

绝对最小值 要求应该是容器有一个与之关联的常量迭代器class。尽管生成器也可以满足该要求。所以一定是有一个常量迭代器,并且所述容器具有常量迭代器类型的 beginend 值。