符合标准的容器

时间:2011-03-28 02:43:30

标签: c++ stl

我一直很好奇是什么需要符合stl标准的容器(或者符合boost标准,我的理解是它们要么相同,要么非常相似)。我已经看到了一些人们称之为符合stl的例子(例如,this one over at codeproject,显然是实际的stl容器),但我不确定我需要拥有哪些容器的组件。 / p>

从我能收集的内容来看,我至少需要这些东西:

  1. 符合STL标准的迭代器(当前的stl只使用双向或更高的迭代器,不知道这是一个要求还是只是发生的机会,仍然需要考虑什么才能被认为是“stl-兼容迭代器“)

  2. 定义分配器的机制(默认为std::allocator),以及正确使用它们(仍然试图找出最后一部分的含义)

  3. 用于元编程的公共typedef(指针类型,const指针类型,引用类型,值类型,const引用类型,差异类型,可能还有其他一些?)。附带问题:什么是difference type

  4. 'generic'(即使用元编程/模板使容器能够容纳几乎任何类型)

  5. 还有什么我错过了,或者更糟糕的是,在上面的列表中出错(可能是诸如const-correctness,线程安全,异常生成/处理等等)?另外,是否存在一个规范文档,详细说明了所需的内容,如果这样的话甚至存在?

1 个答案:

答案 0 :(得分:5)

  1. 迭代器:标准库定义迭代器类别。您希望提供模拟其中一个类别的迭代器。根据您的观点,istream_iteratorostream_iterator允许流为不提供双向迭代器的容器。

  2. 基本上,您使用分配器的allocate(n)n个对象分配空间,并使用deallocate(p, n)释放n指向的p个对象的空间1}}。您通常使用分配器的constructdestroy成员。

  3. 是的,还有其他几个(例如,关联容器定义key_type)。 difference_type是一种可以表示两个指针之间差异的类型。它通常由分配器提供,因此容器只有类似的类型:

    typedef Allocator :: difference_type difference_type;

  4. 不一定(甚至通常)涉及任何元编程,只是(相当基本的)通用编程。即,您定义了一个模板,但不一定在编译时执行任何计算(进行元编程)。

  5. 当前标准没有定义任何有关线程安全的内容。所需要的最终参考是C ++标准本身。您可以免费下载即将推出的C ++ 0x标准(N3242)的当前草稿。容器要求见第23.2节。您可能还想查看Josuttis的 The C ++标准库 - 它比标准本身更温和一些。

    更新:当然,C ++ 11(仅在最初编写之后略有添加)添加了线程,以及有关线程安全,数据竞争等的一些定义。这大致规定了大多数人已经做过的事情:允许并行阅读,但写作必须是独家的。