在 C++ 中实现通用堆栈

     2023-02-21     187

关键词:

【中文标题】在 C++ 中实现通用堆栈【英文标题】:Implementing generic stack in c++ 【发布时间】:2016-02-23 12:14:21 【问题描述】:

我正在使用 STL 和 boost 库实现通用堆栈数据结构。

#include <iostream>
#include <cstdio>
#include <stack>
#include <boost/any.hpp>
#include <boost/type_index.hpp>

using namespace std;

class Stack
    private:
        std::stack<boost::any> st;
    public:
        bool empty();
        int size();
        boost::any top();
        void push(boost::any ele);
        void pop();
;

bool Stack::empty()
    return st.empty();


int Stack::size()
    return st.size();


boost::any Stack::top()
    return st.top();


void Stack::push(boost::any e)
    st.push(e);


void Stack::pop()
    st.pop();


int main()
    Stack st;
    int a = 10;
    st.push(a);
    int b = boost::any_cast<int>(st.top());
    float c = 10.0;
    st.push(c);


虽然它工作得很好,但我想在从堆栈中检索项目时避免显式类型转换。我希望以某种方式堆栈应该在根据项目的类型自动进行类型转换后返回项目。

我打算用堆栈维护一个哈希图,它可以存储每个元素的类型信息,并且可以用于在返回之前对每个项目进行类型转换,但我无法将其编写为代码。请给我一些可能的方法。

【问题讨论】:

让你的堆栈成为一个模板类,就像其他 stl 一样,你可能会在不需要 boost.any 的情况下解决你的任务。 @user3159253:我认为也许 OP 希望能够将不同类型的项目放在同一个堆栈上。 【参考方案1】:

您不能自动转换为正确的类型;那么top() 函数的返回类型将取决于运行时发生的任何事情。那么,在编译时你会给你的top() 函数提供什么返回类型呢?你能做的最好的事情就是

template <typename T>
T top()

  return boost::any_cast<T>(stack.top());

编辑:至于您的评论——不,您不能使用auto 返回类型来获得您希望的行为,因为编译器会在编译时推断出auto 代表什么类型时间 - 它推断出你返回的内容:boost::any。任何更具体的东西只能在运行时知道。

【讨论】:

@sv_jan5 没有。您需要意识到 C++ 不是动态类型语言(auto 不像 C# 中的 dynamic,而是像 C# 中的 var @sehe 谢谢,我将其添加到我的答案中。 技术上,你可以使用auto作为返回类型(它会推导出boost::any @sehe 你说的没错,当然。澄清。 不使用模板也能达到同样的效果吗?

6-7在一个数组中实现两个堆栈

6-7在一个数组中实现两个堆栈(20分)本题要求在一个数组中实现两个堆栈。函数接口定义:StackCreateStack(intMaxSize);boolPush(StackS,ElementTypeX,intTag);ElementTypePop(StackS,intTag);其中Tag是堆栈编号,取1或2;MaxSize堆栈数组的规模;Stack结构... 查看详情

是否可以在一个堆栈中实现多个队列?

】是否可以在一个堆栈中实现多个队列?【英文标题】:IsitpossibletoimplementmultiplequeuesinaStack?【发布时间】:2021-12-2114:05:18【问题描述】:谁能给我解释一下如何在一个堆栈中实现多个队列//implementstacksusingplainarrayswithpushandpopfuncti... 查看详情

在一个数组算法中实现 K 个堆栈

】在一个数组算法中实现K个堆栈【英文标题】:ImplementingKstacksinonearrayalgorithm【发布时间】:2012-01-0120:01:51【问题描述】:如何在一个数组中实现K个堆栈,以最佳的存储使用率(堆栈应该是动态的)?【问题讨论】:K是提前知... 查看详情

python在python中实现倒数第一个堆栈(代码片段)

查看详情

在 C++ 中实现 C++ 线程库

】在C++中实现C++线程库【英文标题】:ImplementingaC++threadingLibraryinc++【发布时间】:2009-02-1106:29:26【问题描述】:我是一名java程序员,但目前正在使用c++语言。与java不同,c++没有定义任何线程实用程序。在C++中实现多线程应用程... 查看详情

在 C90 中实现无溢出的系统堆栈

】在C90中实现无溢出的系统堆栈【英文标题】:Implementinganoverflow-freesystemstackinC90【发布时间】:2011-08-0505:04:12【问题描述】:我刚刚阅读了GoogleGo如何在默认情况下使每个线程的堆栈大小减小,然后在发生溢出时链接到新堆栈(... 查看详情

使用具有自动调整大小的默认整数数组在java中实现堆栈

】使用具有自动调整大小的默认整数数组在java中实现堆栈【英文标题】:Stackimplementationinjavausingdefaultintegerarraywithautoresize【发布时间】:2021-12-2418:34:17【问题描述】:所以我试图在java中创建一个更省时的堆栈实现,但我不知道... 查看详情

如何在 C++ 中实现接口? [复制]

】如何在C++中实现接口?[复制]【英文标题】:howtoimplementInterfacesinC++?[duplicate]【发布时间】:2012-04-0303:42:42【问题描述】:可能重复:PreferredwaytosimulateinterfacesinC++我很想知道C++中是否有接口,因为在Java中,设计模式的实现主要... 查看详情

Django:在通用 DetailView 中实现表单

】Django:在通用DetailView中实现表单【英文标题】:Django:ImplementingaFormwithinagenericDetailView【发布时间】:2018-01-2110:25:36【问题描述】:在浏览了几个谷歌搜索结果页面之后,我仍然拼命地陷入同样的​​问题。我正在尝试在博客... 查看详情

在 C++ 中实现多个接口

】在C++中实现多个接口【英文标题】:Implementingmultipleinterfacesinc++【发布时间】:2013-05-2010:07:44【问题描述】:我的接口层次结构如下:classApublic:voidfoo()=0;;classB:publicApublic:voidtestB()=0;;classC:publicApublic:voidtestC()=0;;现在,我想通过... 查看详情

在 C++ 中实现归并排序

】在C++中实现归并排序【英文标题】:implementingmergesortinC++【发布时间】:2012-08-1508:54:51【问题描述】:我研究过归并排序的理论,但对如何在C++中实现它一无所知。我的问题是,合并排序以递归方式创建数组。但是在实现的时... 查看详情

如何在 C++ 中实现函数超时

】如何在C++中实现函数超时【英文标题】:Howtoimplementtimeoutforfunctioninc++【发布时间】:2017-03-2520:18:51【问题描述】:我有函数f;我想在启动f后抛出异常1s。我无法修改f()。用c++可以吗?tryf();catch(TimeoutException&e)//timeout【问题讨... 查看详情

在 C++ 中实现复杂的继承

】在C++中实现复杂的继承【英文标题】:ImplementingcomplexinheritanceinC++【发布时间】:2009-06-2310:40:59【问题描述】:我有以下现有课程:classGaussianpublic:virtualVectorget_mean()=0;virtualMatrixget_covariance()=0;virtualdoublecalculate_likelihood(Vector&d 查看详情

C++ 无法在 Visual Studio 中实现抽象类

】C++无法在VisualStudio中实现抽象类【英文标题】:C++CannotimplementabstractclassinVisualStudio【发布时间】:2020-02-1220:08:59【问题描述】:我尝试在C++中实现模式状态,但显然我的基类是notaclassorstructname。我在VisualStudio2019中收到此错误... 查看详情

在单链表 C++ 中实现复制构造函数

】在单链表C++中实现复制构造函数【英文标题】:ImplementingcopyconstructorinasinglelinkedlistC++【发布时间】:2017-09-1318:00:16【问题描述】:我有一个C++代码:#include<iostream>usingnamespacestd;structNode;typedefNode*NodePtr;structNodeintItem;NodePtrNex... 查看详情

在 Rails 4 中实现通用搜索

】在Rails4中实现通用搜索【英文标题】:ImplementingUniversalsearchinrails4【发布时间】:2015-05-1219:32:29【问题描述】:我有一个带有多个模型和视图页面的rails4应用程序。我的应用程序的应用程序布局包含一个搜索栏。但它目前处于... 查看详情

如何在 C++ 中实现序列化

】如何在C++中实现序列化【英文标题】:HowtoimplementserializationinC++【发布时间】:2010-12-2101:08:45【问题描述】:每当我发现自己需要在C++程序中序列化对象时,我都会使用这种模式:classSerializablepublic:staticSerializable*deserialize(istrea... 查看详情

在 C++ 中实现 C 库函数

】在C++中实现C库函数【英文标题】:ImplementingClibraryfunctioninC++【发布时间】:2011-10-1416:56:15【问题描述】:在C++中实现C库有什么缺点?该库将用于使用VisualStudio2008或更新版本为普通PC构建Windows应用程序。目前尚不清楚为什么规... 查看详情