一堆独特元素的容器

时间:2012-08-23 10:26:12

标签: c++

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

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

我想在此向您提供哪个容器将是拥有此功能的最佳选择。

我决定在列表中使用堆栈适配器,因为

  1. list确实为元素移动提供了恒定的时间
  2. list是堆栈本机支持的容器之一。
  3. 我选择的缺点是我必须手动检查重复的元素。

    P.S。我的编译器不是那么近,所以请不要建议unordered_set。

2 个答案:

答案 0 :(得分:5)

基本上你必须在恒定时间移动+长搜索或恒定时间搜索+长时间移动之间进行选择。

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

  • 您必须搜索元素是否存在每次时间尝试添加元素
  • 每次都要移动元素,因为很明显,有时你会添加" new"对于容器。

我建议您将元素及其堆栈位置存储在不同的容器中。以提供快速移动的方式提供快速搜索,存储堆栈位置的方式存储元素。用指针连接两者(这样你就可以知道哪个元素位于哪个位置,哪个位置包含哪个元素< - 凌乱的短语,我知道!),你会很快地执行这些操作。

答案 1 :(得分:1)

根据您的要求,在我看来,您想要的结构可以来自Max Heap

如果不是只存储项目,而是存储一对(生成,项目),来自单调递增计数器的生成,那么堆的“根”始终是最后看到的元素(而其他元素也是如此)不是很重要,是吗?)。

  • Pop:堆上的典型弹出操作(delete-max操作)
  • 推送:修改操作,以考虑结构中“项目”的唯一性
    • 查找“item”,如果找到则更新其生成(increase-key操作)
    • 如果没有,请插入(insert操作)

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