c++中的类成为容器的条件是什么?
What are the qualifications for a class in C++ to become a container?
我是c++编程新手,在vector
、deque
、map
等例子中遇到了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的概念将成为代码中实际存在的东西,并且可能存在依赖于这些特性的算法。在此之前,它们是特别的概念。
的绝对最小要求应该是容器有一个与之关联的常量迭代器类。尽管发电机也能满足这个要求。因此,必须存在一个常量迭代器,并且该容器具有常量迭代器类型的begin和end值。
c++概念:容器
容器是用来存储其他对象的对象管理它所包含的对象所使用的内存。
http://en.cppreference.com/w/cpp/concept/Container
,
根据这些定义,我认为我们可以说容器应该能够存储任意数量的元素(尽管该数量可以是编译时常量)。容器拥有它所包含的对象,包括在堆或堆栈中为它们分配空间(对于容器是一个容器对象,用于存储其他对象的集合对象(它的元素)。它们是作为类模板实现的
在元素支持的类型上有很大的灵活性。http://www.cplusplus.com/reference/stl/
array
容器)。因此,程序员不需要为对象分配或释放new
或delete
的内存。
在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:虽然元组可以保存任意数量的对象,但需要指定每个对象的类型,因此它不具有一般容器所期望的灵活性。元组可以更准确地归类为一种结构。
- 这个循环测试条件是什么意思?
- Haskell中用多态性替换条件的等效模式是什么?
- 计算文本文件中行数的最佳条件是什么
- 在条件上更新变量的最快方法是什么?
- 同时执行 if 和 else 条件的逻辑是什么
- 在发出等待条件变量的信号后,线程何时获取锁?是什么决定了它
- 这个奇怪的条件运算符语法是什么
- 编译器减少 std::copy to memcpy (memmove) 的条件是什么?
- 条件是什么意思
- 有条件地控制 for 循环方向的最佳方法是什么
- while 循环的两个条件。我的错误是什么?
- 条件语句在比较表达式时的基础是什么?
- 在 C++11 中等待多个条件变量的最佳方法是什么?
- 动态绑定的条件到底是什么
- if()语句使用条件的目的是什么?C++
- 移动构造函数的后置条件是什么
- 使用条件语句激活函数的目的是什么
- 逗号在条件语句中的优点是什么
- 在选择函数中等待fd的异常条件是什么?
- c++中的类成为容器的条件是什么?