c++中的类成为容器的条件是什么?

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

本文关键字:条件 是什么 c++      更新时间:2023-10-16

我是c++编程新手,在vectordequemap等例子中遇到了containers这个术语。

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

我将从Range这个概念开始。

Range只有两个方法——begin和end。它们都返回相同类型的迭代器(注意:有人建议允许end返回一个Sentinel)。

迭代器被假定为读者所理解。

高质量的Range还可以显示empty, size, front, back和operator[](特别是随机访问)。

对于for(:)循环,您可以通过使用原始C数组,具有begin()end()方法,或者在与您的类型相同的名称空间中具有将您的类型作为一个参数(并返回类似迭代器的东西)的自由函数来限定Range。在这篇文章中,标准中唯一消耗Ranges的是for(:)循环。有人可能会说,这个答案是c++中Range概念的唯一实际定义。


其次,容器。

Container是至少由拥有其元素的前向迭代器(输入和输出范围通常不称为Container)组成的Range。顺序容器和关联容器是不同的,它们都在标准中定义。

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

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

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

关联容器有一个键类型。它们中的许多是成对的容器。存储的数据通常是部分const(数据的"键"部分,在set s的情况下是键或整个字段)。它们有插入和放置的提示和不提示——它们管理自己的顺序。它们也有.find.count方法。

目前std库中没有依赖于容器性的函数。并且有一个积极的提议,将容器性和范围性形式化为c++ 17中的一个概念。容器的实际技术定义在标准中,以防你需要创建一个真正的容器;然而,通常情况下你确实需要一个带有编辑方法和所有权机制的范围。根据我的经验,容器的概念主要是为了在标准中更容易地指定行为。

添加了Range -v3之类的东西之后,Range和Container的概念将成为代码中实际存在的东西,并且可能存在依赖于这些特性的算法。在此之前,它们是特别的概念。

的绝对最小要求应该是容器有一个与之关联的常量迭代器类。尽管发电机也能满足这个要求。因此,必须存在一个常量迭代器,并且该容器具有常量迭代器类型的beginend值。

c++概念:容器

容器是用来存储其他对象的对象管理它所包含的对象所使用的内存。

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

,

容器是一个容器对象,用于存储其他对象的集合对象(它的元素)。它们是作为类模板实现的

在元素支持的类型上有很大的灵活性。http://www.cplusplus.com/reference/stl/

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

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

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

要求:

  • 必须包含任意数量的对象
  • 它所持有的对象是任意类型的(尽管它可能必须满足某些要求,例如:可分类的)

可能的特性
    虽然有些容器是分配器感知的,但它不一定是。
  • 容器可以容纳一种以上类型的对象(例如:map,虽然map可以被认为保存对象对)
  • 虽然容器可以是可迭代的,但这不是必需的。

容器类

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

不被视为容器的类:

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