C++ 用于唯一元素堆栈的容器

C++ 用于唯一元素堆栈的容器,c++,C++,我要做的是构造一个包含唯一元素的堆栈 如果一个元素被推送到已经在堆栈中的元素,则该元素不会被推送到堆栈中,但现有的元素应该被移动到堆栈的顶部,即。 ABCD+B>ACDB 我想在这里告诉您,哪个容器将是拥有此功能的最佳选择 我决定将用户堆栈适配器置于列表之上,因为 列表确实为元素移动提供了固定时间 列表是堆栈本机支持的容器之一 我选择的缺点是我必须手动检查重复的元素 另外,我的编译器不是最新的,所以请不要建议无序设置。基本上,您必须在固定时间移动+长时间搜索或固定时间搜索+长时间移动之间进行选择

我要做的是构造一个包含唯一元素的堆栈

如果一个元素被推送到已经在堆栈中的元素,则该元素不会被推送到堆栈中,但现有的元素应该被移动到堆栈的顶部,即。 ABCD+B>ACDB

我想在这里告诉您,哪个容器将是拥有此功能的最佳选择

我决定将用户堆栈适配器置于列表之上,因为

  • 列表确实为元素移动提供了固定时间
  • 列表是堆栈本机支持的容器之一
  • 我选择的缺点是我必须手动检查重复的元素


    另外,我的编译器不是最新的,所以请不要建议无序设置。

    基本上,您必须在固定时间移动+长时间搜索或固定时间搜索+长时间移动之间进行选择

    很难说哪一个更耗时,但请考虑一下:

    • 每次尝试添加元素时,都必须搜索该元素是否存在
    • 您不必每次都移动元素,因为很明显,有时您将为容器添加“新”元素

    我建议您将元素及其堆栈位置存储在不同的容器中。以提供快速搜索的方式存储元素,以提供快速移动的方式存储堆栈位置。用指针连接这两个元素(这样你就可以知道哪个元素在哪个位置,哪个位置包含哪个元素)根据你的需求,我觉得你想要的结构可以从

    如果不只是存储项,而是存储一对(generation,item),其中generation来自一个单调递增的计数器,那么堆的“根”总是最后看到的元素(其他元素并不重要,是吗?)

    • Pop:堆上典型的Pop操作(
      delete max
      operation)
    • 推送:修改操作,用于说明结构中“项”的唯一性
      • 查找“项”,如果找到,更新其生成(
        增加键
        操作)
      • 如果没有,则插入它(
        insert
        操作)

    考虑到元素的数量(20),在
    向量上构建堆似乎是一个自然的选择。

    即使没有最新的编译器,您仍然可以使用(这似乎不适合此任务)。感谢boost解决方案,但我想在这里介绍一下stlIf
    无序集的smth(除了编译器支持)那么,为什么不使用一个普通的<代码> STD::SET ?但是,你看,代码> STD::清单是最坏的可能解决方案。不要考虑它。<代码> STD::矢量< /代码>会更有效。如果你真的想要最好的解决方案,你应该考虑。(看一看这个例子,你可以根据自己的需要调整它)@deimus:你说你的评论中只有20个整数,也许这应该在问题中进行编辑。此外,你如何使用堆栈?你只需要在完成推送后使用堆栈属性,还是定期从堆栈中弹出?推送/弹出的相对频率是多少(如果它们是交错的)?谢谢你的回答!我喜欢你的解决方案。基本上,堆栈中元素的数量不会超过20个,元素比较应该是整数的单个比较。所以我想列表就足够了,对吗?@deimus,是的,对于如此少量的数据,你不会看到性能上的任何差异,所以这很好。@deimus:for 20个整数,使用
    std::vector
    和线性搜索。它将适合单个内存块(由vector保证),从而适合单个CPU缓存线。这可能是您可用的最快解决方案(即使搜索在理论上是线性的)。