c++ 我们可以定制STL容器的实现吗?

cbwuti44  于 2022-11-27  发布在  其他
关注(0)|答案(4)|浏览(141)

摘自Bjarne Stroustrup的《C++编程语言》一书:

使用rep指针指向容器中的元素表示是否意味着STL容器的实现是灵活的,可以定制?

idfiyjo8

idfiyjo81#

此图仅用于说明目的。它旨在解释各种容器(如链接列表和Map)的底层基本概念。
C库中的容器都不公开这种内部细节,它们只公开C教科书和C++标准中介绍的方法。例如,std::list(一个双向链表)公开了begin()end(),它们返回开始和结束的迭代器;和其他几个提供对列表内容的访问的方法,这些类型的内部指针都不会被公开。
“自定义”的范围由容器本身定义,即由模板参数定义。std::list的第一个模板参数定义了链表中的内容。这就是您的自定义:它定制了链表中的内容,一个普通的int或一个复杂的类。其他模板的其他参数指定了额外的定制级别。例如,std::map的各种参数指定了map的键和值,以及一个设置map键的迭代顺序的比较运算符。这是相当多的定制。

hkmswyz6

hkmswyz62#

没有“rep指针”,或者至少没有这样的指针暴露给用户。这仅仅是实现如何实现特定容器的一个例子。
不,标准库的内部是不能“定制”的。至少,不是标准定义的那样。不同的实现可以有#define或其他东西来允许你挑选一些细节,但那些将由特定的实现定义。
从广义上讲,如果您需要控制特定容器的特定细节,超出了标准库所允许的范围,您可以自己实现它。

mum43rcc

mum43rcc3#

如果你是一个标准库的实现者,那么你可以用任何你想要的方式定制容器,只要你的实现能够满足C++标准发布的所有标准。
例如,虽然std::map大多数情况下被实现为红黑树,但它并不需要这样做。
作为一个用户,没有你没有暴露的能力,以自定义的实现。
注意,有一些容器适配器和范围/视图只对底层容器的行为给予了一些宽松的要求,你也可以使用你自己的容器。但是它们不一定被认为是STL容器,我想这也不是你所要求的。

holgip5t

holgip5t4#

不管“rep”是什么意思,是的,你可以自定义。但是,对于STL类,一般来说,并没有暗示需要自定义的概念。这些类是由Maven设计的,可以很好地完成他们的工作。还要注意(正如Sam Varshavchik所说)forward_list是模板化的,因此可以用来管理各种对象类型。
下面是forward_list的Microsoft STL源代码:https://github.com/microsoft/STL/blob/main/stl/inc/forward_list搜索“class forward_list”以查看顶级类。可以看到nodeptr和iterator等原语。这些和其他可用的类可以用来构造任何你想要的类,只要你遵守许可证。https://github.com/microsoft/STL/blob/main/LICENSE.txt

相关问题