【问题标题】:How to get a list of unique pointers?如何获取唯一指针列表?
【发布时间】:2013-09-29 10:52:23
【问题描述】:

我有一个

class Widget;
std::list<Widget*> listOfPointers;

listOfPointers 可能包含两个或多个指向同一个对象的指针。所有指针都指向在堆上一一创建的对象,而不是同一个数组的成员。

我如何消除重复项

我试过了:

listOfPointers.sort();
listOfPointers.unique();

但这是自 operator < is not defined for pointers in my problem. 以来未定义的行为

我可以使用定义的 operator== 将每个指针相互比较,但这会导致二次复杂度。

【问题讨论】:

  • 感谢编辑,这就是我没有测试的结果。

标签: c++ pointers


【解决方案1】:

您可以使用sort 的另一个重载,它使用比较器/二进制谓词,并提供std::less&lt;Widget*&gt; 作为谓词:std::less 具有比较任意指针的能力(因此您可以使用它们在set 中或作为map 中的键)。

listOfPointers.sort(std::less<Widget*>());
listOfPointers.unique();

但是,我想指出std::list::sort 并不是特别有效,因为列表不提供随机访问。

【讨论】:

    【解决方案2】:

    从技术上讲,指向不在同一个数组中的对象的指针不能与关系运算符进行比较。在实践中,结果将在您可能遇到的每个编译器上定义明确且一致,并且将是 std::sort 要求的严格弱排序。

    【讨论】:

    • 实际上,Matthieu 提出了一个很好的观点——尽管
    • 其实你带来了一个有趣的点;我听说在我出生之前(!)曾经用 nearfar 指针计算,我想知道它会给实现带来什么样的责任提供可以容纳这些的std::less 版本。
    • 我也是这么想的,直到我的程序中开始出现非常神秘的错误。在消除了所有可能性之后,事实证明指针的未定义比较确实是问题所在。而且我不是在使用一些神秘的平台,而是在相当新的台式计算机上使用 Linux 和 gcc。我的建议是在任何情况下都不要低估未定义的行为。
    • Matthieu:near/far 指针有不同的类型,因此您不必担心将它们相互比较。 Near 指针像往常一样进行比较。远指针是最棘手的:它们需要在比较之前进行线性化(将段左移四位,添加偏移量)。然而,当 C++ 标准化时,人们已经远离分段架构。
    • Martin:恕我直言,我认为您可能误诊了该错误。台式机具有线性内存模型,而 GCC 的 C++ 变体不支持压缩垃圾收集;这些是我知道为什么指针比较可能表现不佳的唯一原因。事实上,sbrk() 系统调用的一个怪癖实际上需要任意指针比较才能在 UNIX 变体下工作。
    猜你喜欢
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多