堆栈及其实现

时间:2013-11-07 05:27:44

标签: c++ stack

如果您有像

这样的堆栈,我对堆栈的工作方式感到困惑
stack<string,vector<int>>

我理解容器是vector类型的容器,它包含整数,但那么字符串的用途是什么?或者即使它不是字符串,也许它是一个bool。第一个论点的目的是什么?

#include <iostream>       
#include <stack>         
#include <vector>         
#include <string>
using namespace std;

int main ()
{
   stack<string,vector<int> > third;  
    third.emplace(1);


  cout << "size of third: " << third.size() << '\n';

}

2 个答案:

答案 0 :(得分:3)

您...

stack<string,vector<int>>

...不是使用std::stack模板的正确方法。几乎总是你只需要一个模板参数,这是堆栈中元素的值类型,因此stack<string>会相对常见,stack<vector<int>>完全合理但不常见。

第二个参数在那里,因此您可以指定一个替代容器,stack API应该在该容器上分层,而不是您通常需要改变的默认值std::deque<T>,其中{{1是} T的第一个模板参数,通常很好。

如果您确实需要指定第二个模板参数,通常为stack,而不是some_container<T> stringT的合法但误导性的不匹配在你的问题中假设。令人困惑的是,vector<int>的第一个模板参数的实际类型仅用于为第二个参数指定默认值stack - 容器类型。堆栈的实际元素类型取自容器类型,因此当您明确指定容器类型时,std::deque<T>的第一个模板参数只是一个占位符,并且在功能上被忽略。这是不幸的 - 我认为标准要求静态断言第一个参数与容器的element_type相匹配,这将有效防止误导代码。

容器类型也有限制 - 它需要支持某些功能,并为stack<>提供某些类型/ typedef,以便将其用于实际的数据存储。

答案 1 :(得分:2)

stack<string,vector<int>>毫无意义,它是一堆字符串,存储在一个int的向量中。显然这不起作用。

stack<int>是一堆整数,存储在deque<int>(默认值)中。

stack<int,vector<int>>是一堆int,存储在一个int的向量中。

stack<int,MyCustomStorage>是一堆int,存储在一个自定义类中(显然你必须自己编写)。

修改

模板中似乎stack<T,C> T仅用于提供C的默认值,默认为deque<T>。堆栈中元素的类型始终为C::value_type