【问题标题】:stl compliant containerstl 兼容容器
【发布时间】:2011-07-24 04:07:36
【问题描述】:

我一直很好奇什么需要符合 stl 的容器(或符合 boost 标准,我的理解是它们要么相同,要么非常相似)。我见过一些人们称之为 stl 兼容的示例(例如,this one over at codeproject,显然还有实际的 stl 容器),但我不确定我需要这些容器的哪些组件。

据我所知,我至少需要这些东西:

  1. 符合 STL 的迭代器(当前的 stl 仅使用双向或更高级别的迭代器,不知道这是必需的还是偶然发生的,仍在弄清楚需要什么才能被视为“stl-兼容的迭代器”)

  2. 定义分配器的机制(默认为std::allocator)以及正确使用它们(仍在尝试弄清楚最后一部分的含义)

  3. 用于元编程的公共类型定义(指针类型、常量指针类型、引用类型、值类型、常量引用类型、差异类型,也许还有其他一些?)。附带问题:difference type 是什么?

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

还有什么我遗漏的,或者更糟的是,在上面的列表中出错了(可能是诸如 const 正确性、线程安全、异常生成/处理等)?另外,如果存在这样的事情,是否有详细说明所需内容的规范文档?

【问题讨论】:

  • 我什至不确定“STL 兼容”是否真的意味着任何比演讲者想要的更多的东西。标准模板库已死;其中大部分都被合并到了今天使用的 C++ 标准库中。因此,如果他们使用术语“C++ 兼容”或“C++ 标准库兼容”可能更有意义。如果某些内容是“符合 C++ 2011 的”,that 可能意味着“您可以将这个容器与新的 for 语法一起使用”。
  • 哦,我没有意识到 stl 与 C++ 标准库不同。我猜同样的问题,但在稍微不同的背景下。我只是在寻找如何创建自己的容器,该容器具有与标准库基本相同的功能/接口,但当然是用于保存不同的数据结构。
  • 很多人使用术语“STL”来表示“在 C++ 标准库中幸存的 STL 部分”。术语的含义通常会随着时间而改变。

标签: c++ stl


【解决方案1】:
  1. 迭代器:标准库定义了迭代器类别。您想提供对这些类别之一进行建模的迭代器。根据您的观点,istream_iteratorostream_iterator 允许流成为不提供双向迭代器的容器。

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

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

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

最初提出这个问题时的现行标准没有定义任何关于线程或线程安全的内容。您使用的任何线程支持都是完全独立的,并且您需要遵循它指定的规则(通常多个线程可以读取一个容器,但一个线程需要独占访问权限才能写入一个容器)。

从 C++11 开始,该标准确实增加了对线程的支持,包括关于线程安全、数据竞争等的定义。这指定允许并行读取,但写入需要独占。

【讨论】:

猜你喜欢
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 2021-07-30
  • 2011-02-07
  • 2014-09-09
  • 2011-04-13
相关资源
最近更新 更多