堆栈及其实现

Stacks and their implementation

本文关键字:实现 堆栈      更新时间:2023-10-16

我对堆栈的工作方式感到困惑,如果你有一个像这样的堆栈

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

你的...

stack<string,vector<int>>

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

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

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

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

stack<string,vector<int>>没有

意义,它是存储在整数向量中的一堆字符串。显然这是行不通的。

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

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

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

编辑

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