【问题标题】:stack of characters, stack of character string, stack of integers, stack of integer arrays etc字符堆栈、字符串堆栈、整数堆栈、整数数组堆栈等
【发布时间】:2009-12-26 19:08:04
【问题描述】:

我想使用 c++ 模板制作一个通用堆栈。 stack的push方法的原型由下式给出 无效推送(t* ptr) 其中 t 是模板参数。现在指针 ptr 可能指向一个整数或整数数组,它可能指向单个字符或字符数组,它可能指向单个双精度数或双精度数组等。 我想要的是,如果 ptr 指向一个整数,我想在 push 方法中分配内存,那么我需要根据整数的大小分配内存,如果 ptr 指向整数数组,那么我需要分配内存根据数组的大小。对于其他原始数据类型也是如此 我的问题是如何确定这个pointe ptr 是指向一个数组还是一个简单的变量。如果无法发现指针指向数组或简单变量,那么建议一种技术,我可以通过该技术编写此堆栈的 push 方法。

【问题讨论】:

  • 您是否希望您的堆栈包含推送内容的副本?还是会获得传递给它的指针的所有权?
  • 我想在堆栈中有东西的副本

标签: c++ templates


【解决方案1】:

您的建议不是一个好主意 - 在 C++ 中无法检测指针是指向单个实例还是指向数组,但需要区别对待这两者。

就我个人而言,我会使用属于 C++ 标准的 std::stack 适配器。

【讨论】:

    【解决方案2】:

    一旦数组“衰减”为指针,就无法推断 T* 指向的数组的大小。

    考虑让您的堆栈类型采用一对指针,一个指向数组中的第一个元素,一个指向数组中的最后一个元素。或者,有一个重载的 push 方法——一个接受一个指针,一个接受一个指针和 size_t 告诉你有多少对象被指向。

    我有点困惑为什么你有一个 T* 作为参数。为什么不像 stl 容器上的大多数“添加”操作一样使用 T?当您使用它时,您是否知道 std::stack 存在(它是 stl 中的“容器适配器”)?即使您有充分的理由重新实现它,在 STL 中寻找 API 设计示例也是一个好主意。

    【讨论】:

      【解决方案3】:

      您的编译器已经负责分配和复制。如果你这样定义推送:

      push(T item)
      

      编译器将为您复制项目,您可以将其填充到您的内部存储中。

      另外,int 和 int[] 是两种不同的类型。如果您想专门制作一个可以接受 T[] 的堆栈,则可以使 push 重载:

      push(T[] items)
      

      我假设您需要此功能,以便您可以将这些作为单独的项目推送到堆栈上,而不是因为您想要一个异构容器。在此推送中,您可以遍历数组中的每个项目并将其存储到您的内部存储中。

      【讨论】:

        【解决方案4】:

        您可以将这样的模板部分特化用于数组堆栈:

        template <typename T>
        class Stack <T*>
        {
         //other stuff
        };
        

        但我不确定你的编译器是否支持它,因为 vc++ 7.0 不支持部分模板规范,以后的版本可能支持它。

        据我所知 linux gnu 8.2 GNU c++ 支持它。

        【讨论】:

          最近更新 更多