对于C++;? 我在C++中做了一些新的HackerRank问题,我发现似乎有几种方法来解决这个问题,我想知道哪种方式是最广泛使用和/或最有效的。该问题需要创建一个类,该类既包含stack和queue变量,也包含stack\u push/stack\u pop和queue\u push函数
从我在谷歌上搜索的内容来看,我似乎可以使用对于C++;? 我在C++中做了一些新的HackerRank问题,我发现似乎有几种方法来解决这个问题,我想知道哪种方式是最广泛使用和/或最有效的。该问题需要创建一个类,该类既包含stack和queue变量,也包含stack\u push/stack\u pop和queue\u push函数,c++,class,stack,queue,deque,C++,Class,Stack,Queue,Deque,从我在谷歌上搜索的内容来看,我似乎可以使用std::vector,std::stack和std::queue,或者std::deque,或者其他 我不知道如何确定哪一个最好用。有什么建议吗 编辑: 我对两者都使用std::vector,然后使用std::stack以及std::queue实现,在一个小的ish测试用例中,我看到了两者的精确性能。 编辑2: 对于一个大得多的测试用例,它看起来像std:stack/std:queue比std:vector性能更好。我猜这是因为FIFO队列的一半在向量
std::vector
,std::stack
和std::queue
,或者std::deque
,或者其他
我不知道如何确定哪一个最好用。有什么建议吗
编辑:
我对两者都使用std::vector
,然后使用std::stack
以及std::queue
实现,在一个小的ish测试用例中,我看到了两者的精确性能。
编辑2:
对于一个大得多的测试用例,它看起来像
std:stack
/std:queue
比std:vector
性能更好。我猜这是因为FIFO队列的一半在向量上没有效率,但我需要进一步测试。std::stack
使用std::deque
作为底层容器。std::queue
也是如此。看到和
从引用的页面
template<
class T,
class Container = std::deque<T>
> class stack;
模板<
T类,
类容器=std::deque
>类堆栈;
Container—用于存储数据的基础容器的类型
元素。容器必须满足以下要求:
序列容器。此外,它必须提供以下内容
具有常用语义的函数:back()push_back()pop_back()
标准容器std::vector、std::deque和std::list满足
这些要求
如果情况允许,我将使用
std::stack
或std::queue
,而不必考虑底层细节。如果我必须采取更多的控制,我会选择std::deque
std::stack
使用std::deque
作为底层容器。std::queue
也是如此。看到和
从引用的页面
template<
class T,
class Container = std::deque<T>
> class stack;
模板<
T类,
类容器=std::deque
>类堆栈;
Container—用于存储数据的基础容器的类型
元素。容器必须满足以下要求:
序列容器。此外,它必须提供以下内容
具有常用语义的函数:back()push_back()pop_back()
标准容器std::vector、std::deque和std::list满足
这些要求
如果情况允许,我将使用
std::stack
或std::queue
,而不必考虑底层细节。如果我需要更多的控制,我会选择std::deque
经验法则是,首先确定所有需求,然后使用满足所有需求的最简单数据结构。由于您没有搜索要求,最好实现一个C风格的链表。对于堆栈,您只需要一个指向前端元素的指针,但是对于队列,您必须维护两个指针来跟踪前端元素和最后一个元素。这可能是最快的实现 经验法则是,首先确定所有需求,然后使用满足所有需求的最简单数据结构。由于您没有搜索要求,最好实现一个C风格的链表。对于堆栈,您只需要一个指向前端元素的指针,但是对于队列,您必须维护两个指针来跟踪前端元素和最后一个元素。这可能是最快的实现 始终使用std::vector
std::stack
和std::queue
本身并不是容器,它们通常使用底层容器std::vector
@Jake:好吧,只要你不得不问,这是最简单和最好的选择。一旦你知道如何理解另一种数据结构更好,你就不必再问了。@KerrekSB:std::vector
对于堆栈来说很好。对于一个队列来说非常糟糕,除非你打算将它用作循环队列并管理前后索引。不,@LokiAstari说你不应该构建它,而应该使用已经可用的。然而,后进先出是一个队列,而不是堆栈。如果您正在构建堆栈,您应该使用std::stack
。始终使用std::vector
std::stack
和std::queue
本身并不是容器,它们通常使用底层容器std::vector
@Jake:好吧,只要您需要询问,这是最简单和最好的选择。一旦你知道如何理解另一种数据结构更好,你就不必再问了。@KerrekSB:std::vector
对于堆栈来说很好。对于一个队列来说非常糟糕,除非你打算将它用作循环队列并管理前后索引。不,@LokiAstari说你不应该构建它,而应该使用已经可用的。然而,后进先出是一个队列,而不是堆栈。如果您正在构建堆栈,则应使用std::stack
。