c++ - 堆栈及其实现

标签 c++ stack

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

stack<string,vector<int>>

我理解容器是vector类型的容器,里面是整数,那么string有什么用呢?或者即使它不是字符串,也可能是 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';

}

最佳答案

你的...

stack<string,vector<int>>

...不是使用 std::stack 的正确方法模板。几乎总是你只需要一个模板参数,它是堆栈中元素的值类型,所以 stack<string>会比较常见,并且stack<vector<int>>完全有道理,但很少见。

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

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

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

关于c++ - 堆栈及其实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19828594/

相关文章:

C++ 测试输入是否为 double /字符

c++ - 工厂方法实现 - C++

c++ - 一维智能指针不适用于语法(*)++

c++ - 使用堆栈加密字符串

c - 在运行时使用任意堆栈数据手动调用 C 函数

winapi - Windows 函数调用中的堆栈是如何设置的?

c++ - 在一个线程中创建对象并使用 std::atomic 访问另一个线程

c++ - Boost智能指针设计问题

java - 具有两个在 Pop 条件下失败的堆栈的 minstack 的实现

C-修复递归中的堆栈溢出