【问题标题】:Design Question: How can I maintain a stack of object设计问题:如何维护一堆对象
【发布时间】:2010-02-23 19:04:00
【问题描述】:

我有一个结构调用'A',它有一个属性'i',像这样:

typedef struct a {
   a() { i = 0;}
   int i;
} A;

我想在我的 Main 类中维护一堆 A:

class Main {
   public:  
      void save();
      void doSomethingToModifyCurrentA();
      void restore();

   private:
     A currentA;
     stack<A> aStack;
  }

我想编写函数 save(),它将 A(例如 i)的当前值保存到堆栈中,我可以继续 doSomethingToModifyCurrentA() 来更改 currentA。稍后,我可以通过调用 restore() 来恢复 A。

我的问题是

  • 如何为 A 的副本分配内存到“堆栈”?
  • 如何弹出A的副本并释放内存并恢复'currentA'的值?

【问题讨论】:

  • 在 C++ 中,你不需要围绕你的结构的 typedef。

标签: c++ data-structures struct stack


【解决方案1】:

在 C++ STL 库中,您可以使用 stack 实现,还有 push 和 pop 方法。

push 用于将一项添加到堆栈中,pop 用于将一项从堆栈中弹出。

看看this 教程。

【讨论】:

    【解决方案2】:

    您不需要做任何事情来在堆栈上保留内存。底层容器(默认为双端队列)为您管理内存。

    三个重要的方法是……

    mystack.push (myvalue);
    mystack.top ();
    mystack.pop ();
    

    pop 不会读取最高值 - 只是将其丢弃。 top 方法返回对当前顶部值的引用,所以你可以写...

    ??? = mystack.top ();
    mystack.top () = ???;
    

    读取或覆盖顶部值。

    这些方法转换为底层双端队列中的以下调用...

    mydeque.push_back (myvalue);
    mydeque.back ();
    mydeque.pop_back ();
    

    就我个人而言,我通常只是直接使用双端队列——尽管严格来说,堆栈更利于可读性和可维护性,因为它更好地表达了意图并防止你做一些与该意图不兼容的事情。

    【讨论】:

      【解决方案3】:

      您可以考虑为当前 A 使用 A&。(并查看 STL 的 stack 以了解实现

      【讨论】:

      • 如果该答案确实回答了问题,我会 +1 :/
      • @rRomain:我以为我在回答一个关于分配 currentA 的隐含问题,我想我误读了这个问题。哦,好吧;)
      • 我正在使用 STL 的堆栈。当我推入/弹出堆栈时,我只是不知道如何分配我的 A 类的内存/空闲内存。我发现的所有示例都使用堆栈。我正在寻找一个堆栈(一个类)。
      • 推送或弹出时不分配或释放内存。仅在创建时。
      【解决方案4】:

      假设 A 相对简单(即使不只是一个 int 作为您的示例),您实际上可以通过使用按值堆栈并让它复制和分配内存来解决您的两个问题。

      使用您的示例代码:

      void Main::save()
      {
          aStack.push(currentA);
      }
      
      void Main::restore()
      {
          currentA = aStack.top();
          aStack.pop();
      }
      

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 2010-12-27
        • 2010-10-04
        • 2011-05-07
        • 1970-01-01
        相关资源
        最近更新 更多