我想要做的是构建一个包含独特元素的堆栈。一堆独特元素的容器
如果一个元件被推向这已经在堆栈中的元件没有被按下,但现有elemetn应该被移动到堆栈的顶部,即 ABCD + B> ACDB
我想在这里从你哪个容器将是具有此功能的最佳选择。
我决定在列表中的用户栈适配器,因为
- 列表并提供恒定的时间元素移动
- 列表是堆栈中的原生支持的容器之一。
我选择的缺点是我必须手动检查重复的元素。
P.S.我的编译器不是那么近,所以请不要建议unordered_set。
我想要做的是构建一个包含独特元素的堆栈。一堆独特元素的容器
如果一个元件被推向这已经在堆栈中的元件没有被按下,但现有elemetn应该被移动到堆栈的顶部,即 ABCD + B> ACDB
我想在这里从你哪个容器将是具有此功能的最佳选择。
我决定在列表中的用户栈适配器,因为
我选择的缺点是我必须手动检查重复的元素。
P.S.我的编译器不是那么近,所以请不要建议unordered_set。
基本上你必须选择恒定时间移动+长搜索,或恒定时间搜索+长时间移动。
很难说哪个会比较费时,但考虑到这一点:
我建议你存储元素及其栈位置在不同的容器。以提供快速搜索的方式存储元素,以提供快速移动的方式存储堆栈位置。连接两个指针(这样你就可以知道哪个元素位于哪个位置,哪个位置可以容纳哪个元素 - 杂乱的短语,我知道它!),并且你会执行的东西相当快。
感谢您的回答!我喜欢你的解决方案。基本上堆栈中元素的数量不会超过20个,并且元素比较应该是整数的单个比较。所以我想列表就足够了这个权利? – deimus
@deimus,是的,对于如此少量的数据,您不会看到任何区别是性能,所以没关系。 – SingerOfTheFall
@deimus:对于20个整数,使用'std :: vector'和一个线性搜索。它将适合单块内存(由矢量保证),因此只需一行CPU高速缓存。这可能是最快的解决方案(即使搜索在理论上是线性的)。 –
根据您的要求,在我看来,您想要的结构可能来自Max Heap。
如果不是仅存储该项目,而是存储一对(生成,项目),并且生成来自单调增加的计数器,那么堆的“根”始终是最后一个可见元素(以及其他元素真的不重要,是吗?)。
delete-max
操作)increase-key
操作)insert
操作)鉴于元素数量(20),在vector
上构建堆似乎是一个自然选择。
即使没有最近的编译器,你仍然可以使用[boost :: unordered_set](http://www.boost.org/doc/libs/release/doc/html/boost/unordered_set.html)(不是它看起来好像适合于这项任务)。 – Mankarse
感谢提升解决方案,但我想在这里从stl – deimus
smth如果'unordered_set'是一种可能性(除了编译器支持),为什么不使用正常的'std :: set'呢?但是你看看它,'std :: list'是最糟糕的解决方案。甚至不要考虑它。 'std :: vector'将会更有效率。 –