摘自Bjarne Stroustrup的《C++编程语言》一书:
使用rep指针指向容器中的元素表示是否意味着STL容器的实现是灵活的,可以定制?
rep
idfiyjo81#
此图仅用于说明目的。它旨在解释各种容器(如链接列表和Map)的底层基本概念。C库中的容器都不公开这种内部细节,它们只公开C教科书和C++标准中介绍的方法。例如,std::list(一个双向链表)公开了begin()和end(),它们返回开始和结束的迭代器;和其他几个提供对列表内容的访问的方法,这些类型的内部指针都不会被公开。“自定义”的范围由容器本身定义,即由模板参数定义。std::list的第一个模板参数定义了链表中的内容。这就是您的自定义:它定制了链表中的内容,一个普通的int或一个复杂的类。其他模板的其他参数指定了额外的定制级别。例如,std::map的各种参数指定了map的键和值,以及一个设置map键的迭代顺序的比较运算符。这是相当多的定制。
std::list
begin()
end()
int
std::map
hkmswyz62#
没有“rep指针”,或者至少没有这样的指针暴露给用户。这仅仅是实现如何实现特定容器的一个例子。不,标准库的内部是不能“定制”的。至少,不是标准定义的那样。不同的实现可以有#define或其他东西来允许你挑选一些细节,但那些将由特定的实现定义。从广义上讲,如果您需要控制特定容器的特定细节,超出了标准库所允许的范围,您可以自己实现它。
#define
mum43rcc3#
如果你是一个标准库的实现者,那么你可以用任何你想要的方式定制容器,只要你的实现能够满足C++标准发布的所有标准。例如,虽然std::map大多数情况下被实现为红黑树,但它并不需要这样做。作为一个用户,没有你没有暴露的能力,以自定义的实现。注意,有一些容器适配器和范围/视图只对底层容器的行为给予了一些宽松的要求,你也可以使用你自己的容器。但是它们不一定被认为是STL容器,我想这也不是你所要求的。
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
4条答案
按热度按时间idfiyjo81#
此图仅用于说明目的。它旨在解释各种容器(如链接列表和Map)的底层基本概念。
C库中的容器都不公开这种内部细节,它们只公开C教科书和C++标准中介绍的方法。例如,
std::list
(一个双向链表)公开了begin()
和end()
,它们返回开始和结束的迭代器;和其他几个提供对列表内容的访问的方法,这些类型的内部指针都不会被公开。“自定义”的范围由容器本身定义,即由模板参数定义。
std::list
的第一个模板参数定义了链表中的内容。这就是您的自定义:它定制了链表中的内容,一个普通的int
或一个复杂的类。其他模板的其他参数指定了额外的定制级别。例如,std::map
的各种参数指定了map的键和值,以及一个设置map键的迭代顺序的比较运算符。这是相当多的定制。hkmswyz62#
没有“
rep
指针”,或者至少没有这样的指针暴露给用户。这仅仅是实现如何实现特定容器的一个例子。不,标准库的内部是不能“定制”的。至少,不是标准定义的那样。不同的实现可以有
#define
或其他东西来允许你挑选一些细节,但那些将由特定的实现定义。从广义上讲,如果您需要控制特定容器的特定细节,超出了标准库所允许的范围,您可以自己实现它。
mum43rcc3#
如果你是一个标准库的实现者,那么你可以用任何你想要的方式定制容器,只要你的实现能够满足C++标准发布的所有标准。
例如,虽然
std::map
大多数情况下被实现为红黑树,但它并不需要这样做。作为一个用户,没有你没有暴露的能力,以自定义的实现。
注意,有一些容器适配器和范围/视图只对底层容器的行为给予了一些宽松的要求,你也可以使用你自己的容器。但是它们不一定被认为是STL容器,我想这也不是你所要求的。
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