设计问题:如何维护一堆对象

时间:2010-02-23 19:04:00

标签: c++ data-structures struct stack

我有一个结构调用'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'的值?

4 个答案:

答案 0 :(得分:3)

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

push用于向堆栈添加项目,pop用于从堆栈中弹出一个。

查看this教程。

答案 1 :(得分:1)

您无需执行任何操作即可在堆栈上保留内存。底层容器(默认情况下为deque)为您管理内存。

三个重要的方法是......

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

pop不会读取最高值 - 只是丢弃它。 top方法返回对当前最高值的引用,因此您可以编写...

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

读取或覆盖最高值。

这些方法转换为底层deque中的以下调用...

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

就个人而言,我通常只是直接使用deque - 虽然严格来说,堆栈更易于提高可读性和可维护性,因为它可以更好地表达意图并阻止您做一些与该意图不兼容的事情。

答案 2 :(得分:0)

您可以考虑使用A&amp;对于当前的A.(并查看STL的stack以了解实现

答案 3 :(得分:0)

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

使用示例代码:

void Main::save()
{
    aStack.push(currentA);
}

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