C++中的class有什么条件可以成为容器?
What are the qualifications for a class in C++ to become a container?
我是 C++ 编程的新手,遇到了术语 containers
以及 vector
、deque
、map
等示例
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.
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.
鉴于这些定义,我认为我们可以说容器应该能够存储任意数量的元素(尽管该数量可以是编译时常量)。容器拥有它包含的对象,包括在堆或堆栈(对于 array
容器)中为它们分配 space。因此,程序员不需要 new
或 delete
(分配或释放)对象的内存。
在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" 部分,在 set
s 的情况下是键或整个字段)。他们有插入和放置有和没有提示——他们管理自己的订单。他们还有 .find
和 .count
方法。
std 库中目前没有依赖于 Container-ness 的函数。并且有一个积极的提议,将 Container-ness 和 Range-ness 形式化为 C++17 中的一个概念。 Container 的实际技术定义在标准中,以防您需要准确创建实际容器;但是,通常您确实需要一个具有编辑方式和所有权机制的范围。以我的经验,容器的概念主要是为了在标准中更容易指定行为。
添加Ranges-v3之类的东西后,Range和Container的概念将是实际存在于代码中的东西,并且可能会有完全依赖于这些特性的算法。在此之前,它们更像是临时概念。
绝对最小值 要求应该是容器有一个与之关联的常量迭代器class。尽管生成器也可以满足该要求。所以一定是有一个常量迭代器,并且所述容器具有常量迭代器类型的 begin 和 end 值。
我是 C++ 编程的新手,遇到了术语 containers
以及 vector
、deque
、map
等示例
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.
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.
鉴于这些定义,我认为我们可以说容器应该能够存储任意数量的元素(尽管该数量可以是编译时常量)。容器拥有它包含的对象,包括在堆或堆栈(对于 array
容器)中为它们分配 space。因此,程序员不需要 new
或 delete
(分配或释放)对象的内存。
在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" 部分,在 set
s 的情况下是键或整个字段)。他们有插入和放置有和没有提示——他们管理自己的订单。他们还有 .find
和 .count
方法。
std 库中目前没有依赖于 Container-ness 的函数。并且有一个积极的提议,将 Container-ness 和 Range-ness 形式化为 C++17 中的一个概念。 Container 的实际技术定义在标准中,以防您需要准确创建实际容器;但是,通常您确实需要一个具有编辑方式和所有权机制的范围。以我的经验,容器的概念主要是为了在标准中更容易指定行为。
添加Ranges-v3之类的东西后,Range和Container的概念将是实际存在于代码中的东西,并且可能会有完全依赖于这些特性的算法。在此之前,它们更像是临时概念。
绝对最小值 要求应该是容器有一个与之关联的常量迭代器class。尽管生成器也可以满足该要求。所以一定是有一个常量迭代器,并且所述容器具有常量迭代器类型的 begin 和 end 值。