1

如果您有类似的堆栈,我对堆栈的工作方式感到困惑

stack<string,vector<int>>

我理解容器是向量类型的容器,其中包含整数,但是字符串的用途是什么?或者即使它不是字符串,也可能是一个布尔值。第一个论点的目的是什么?

#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';

}
4

2 回答 2

3

您的...

stack<string,vector<int>>

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

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

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

容器类型也有限制 - 它需要支持某些功能并提供某些类型/类型定义stack以将其用于实际数据存储。

于 2013-11-07T05:36:00.497 回答
2

stack<string,vector<int>>没有意义,它是一堆字符串,存储在整数向量中。显然那是行不通的。

stack<int>是一个 ints 堆栈,存储在 a deque<int>(默认值)中。

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

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

编辑

看来,在模板stack<T,C> T中只用于为 提供一个默认值C,它默认为deque<T>. 堆栈中元素的类型始终为C::value_type

于 2013-11-07T05:36:16.990 回答