如果您有像
这样的堆栈,我对堆栈的工作方式感到困惑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';
}
答案 0 :(得分:3)
您...
stack<string,vector<int>>
...不是使用std::stack
模板的正确方法。几乎总是你只需要一个模板参数,这是堆栈中元素的值类型,因此stack<string>
会相对常见,stack<vector<int>>
完全合理但不常见。
第二个参数在那里,因此您可以指定一个替代容器,stack
API应该在该容器上分层,而不是您通常需要改变的默认值std::deque<T>
,其中{{1是} T
的第一个模板参数,通常很好。
如果您确实需要指定第二个模板参数,通常为stack
,而不是some_container<T>
string
和T
的合法但误导性的不匹配在你的问题中假设。令人困惑的是,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
。