【问题标题】:Which data structure is best for basic stacks and queues in C++?哪种数据结构最适合 C++ 中的基本堆栈和队列?
【发布时间】:2016-08-16 13:30:20
【问题描述】:

我正在用 C++ 做一些新手 HackerRank 问题,我发现似乎有几种方法可以解决这个问题,我想知道哪种方法使用最广泛和/或最有效。该问题需要为它们创建一个包含stackqueue 变量以及stack_push/stack_popqueue_push/queue_pop 函数的类。

从我的谷歌搜索来看,我似乎可以使用std::vectorstd::stackstd::queue,或者std::deque,也许还有其他。

我不确定如何确定哪个最适合使用。有什么建议吗?

编辑: 我对两者都使用了std::vector,然后使用std::stackstd::queue 实现了,对于小型测试用例,我看到两者的性能完全相同。 编辑2: 对于更大的测试用例,它看起来像 std:stack/std:queue 优于 std:vector。我猜这是因为 FIFO 队列的一半对向量效率不高,但我需要对此进行更多测试。

【问题讨论】:

  • 始终使用std::vector
  • std::stackstd::queue 本身不是容器,它们通常采用底层容器 std::vector
  • @Jake:嗯,只要你要问,这简直是最简单也是最好的选择。一旦你知道如何欣赏另一种数据结构更好,你就不必再问了。
  • @KerrekSB: std::vector 适合堆栈。对于队列来说非常糟糕,除非您将其用作循环队列并管理前后索引。
  • 不,@LokiAstari 说你不应该构建它,而只是使用已经可用的。但是,LIFO 是一个队列,而不是堆栈。如果你正在构建堆栈,你应该使用std::stack

标签: c++ class stack queue deque


【解决方案1】:

std::stack 使用std::deque 作为底层容器。 std::queue 也是如此。见http://en.cppreference.com/w/cpp/container/stackhttp://en.cppreference.com/w/cpp/container/queue

从参考页面

template<
    class T,
    class Container = std::deque<T>
> class stack;

Container - 用于存储 元素。容器必须满足以下要求 序列容器。此外,它必须提供以下内容 具有通常语义的函数: back() push_back() pop_back() 标准容器 std::vector、std::deque 和 std::list 满足 这些要求。

如果情况允许,我会使用std::stackstd::queue,而不用担心底层细节。如果我必须控制更多,我会选择std::deque

【讨论】:

    【解决方案2】:

    经验法则是,首先确定您的所有需求,然后使用满足所有需求的最简单的数据结构。由于您没有搜索要求,因此最好实现 C 样式的链表。对于堆栈,您只需要一个指向前元素的指针,但对于队列,您必须维护 2 个指针来跟踪前元素和最后一个元素。这可能是最快的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多