为什么容器比较运算符分配器不可知?

问题描述 投票:0回答:1

容器的比较运算符需要匹配的分配器类型,例如请参阅

std::vector
比较运算符

这对我来说似乎没有必要……直观上,操作员所需要做的就是比较容器及其元素的大小。它们存储的内存来自哪里并不重要。

这是否有更深层次的原因,或者只是因为这不被视为相关用例?

预期:

std::vector
(例如)为不同的分配器定义比较运算符,例如
std::allocator<int>
(左轴)和
std::pmr::polymorphic_allocator<int>
(右轴)。

实际:

std::vector
仅针对具有相同分配器类型的 LHS 和 RHS 声明比较运算符,根据 cppreference.com。

c++ containers comparison allocator
1个回答
0
投票

我的整个职业生涯都在雷达下度过,从未发表评论,从未在论坛投票,从未提出问题。最近在这里注册了一个帐户,以发布对我和这里其他人个人影响很大但没有声誉的问题的答案。我对我实际上可以理解的随机开放问题的搜索将我带到了这里。

现在,我越想答案,就越觉得你的问题确实很基础,触及了STL和其他技术的本质。我已经足够大了,经历过这个行业的诞生,也见证了它的许多动荡。我想到了我们几十年来所有的斗争变得如此宗教化,以及历史上该行业发生了一些非常糟糕的转变的时刻。我相信 90 年代末 STL 的出现就是一个这样的转折,当时 C++ 可以走一条更简单、更清晰的道路,例如,如果它允许类似 Pascal 的函数中的函数。

有史以来最重要的斗争是内存管理。我们都试图实现的是在液体存储基板上运行的算法。一些人已经确定,为了实现这一目标,我们实际上需要新的语言,其中内存通过设计从算法中抽象出来,例如C#、Java。在沿着这条道路走下去的过程中,设计师们打破了对我们许多人来说最重要的一件事:结构的凝聚力。在这样的语言中,你甚至不允许考虑请求 offsetof(struct.field) 的想法,而 sizeof(struct) 是一个严格保守的秘密。您也不允许假设在 struct {SomeType a; 中SomeOtherType b;},字段 a 和 b 在内存布局中相邻。

C++ 对算法/分配分离的回答是 STL。 STL 的算法使用从用户的基本数据类型中抽象出来的容器迭代器。在幕后,容器也与底层内存分配分离。由于它们需要性能,算法可以而且需要利用底层分配器的属性(公理)。 STL 试图实现的目标是让分配器在上层算法运行时以及迭代器迭代时自由移动、增长和缩小元素和范围。令人难以置信的复杂程度源于这里。 C++ 现在必须大量导入范畴代数。现在一切都必须是公理化且易于处理的。您可以用科学校对取代传统的调试。

Allocator 不仅是比较运算符的参数,而且是所有操作的参数。让我们对索引运算符 [] 进行采样...它也采用分配器参数。因此,也许在迭代容器时移动元素是可能的。但这是未竟的事业,而且感觉像是一个陷阱。这样一来,我们肯定需要在 STL 和 C++ 的其余部分之间进行互操作,就像 C# 中的托管与非托管一样。另外,让我们想一想:这些 && 右值引用到底是关于什么的?我看到 STL 和 BOOST 成为隐藏在头文件中的 dotNET 的趋势。

在各地推广分配器的另一个原因是承诺更好的性能。在同一个分配器中,指针和引用是完全可比的。因此,可以在参考级别测试等价性==,而无需深入内容。

请注意,我真诚地试图提供帮助并分享观点。我现在要做好准备,迎接即将到来的一连串反对票。问候。

© www.soinside.com 2019 - 2024. All rights reserved.