为堆栈实现通用集合

时间:2018-09-17 22:22:00

标签: c++ pointers stack

在创建堆栈时指定数据类型时,我遇到了两种不同的实现。

stack<string>* stringStack = new Stack<string>();

Stack<string> stringStack = new Stack<string>();

指向堆栈的指针是什么?

例如,我的教授为我们提供了代码:

stack<std::string>* stringStack = new Stack<std::string>();

stringStack->push(“Jim”);
std::string top = stringStack->peek();
std::cout << top << “ is at the top of the stack \n”;

在这里,我的教授使用了第一种情况。

当我在线搜索解决方案时,我找到了代码

Stack<string> stringStack = new Stack<string>();
stringStack.push(17);        
int a = stringStack.pop(); 

我对两者之间的区别感到困惑。 如果有人可以向我解释两者之间的区别,那么有没有就可以了!

1 个答案:

答案 0 :(得分:1)

  

当我在线搜索解决方案时

那是您的问题。不要搜索互联网并复制/粘贴您不了解的代码。那是你毕业后的

  

我找到了密码

Stack<string> stringStack = new Stack<string>();
stringStack.push(17);        
int a = stringStack.pop();

那不会编译。 new用于进行动态分配,并返回 pointer 。左侧(Stack<string> stringStack)上没有指针。

您看到的“神秘的” *注释在左侧(以正确的代码表示)是一个指针。如果它不是类型的一部分,则它是一个 dereference 运算符,表示“查找此指针指向的内容”。

动态内存分配必须成对完成……newdelete,否则会泄漏。简要演示:

{ // a scope begins
   int x = 10; // not a pointer; stack allocated
} // a scope ends, integer automatically is gone

{ // a scope begins
   int *px = new int; // px points to integer-sized memory box
   *px = 10; // put 10 into that box
} // a scope ends, you didn't delete px, you leaked memory

这里讨论了是否应该动态分配某些东西的问题,也许您会在其中找到一些有价值的东西:

Why should I use a pointer rather than the object itself?

但是,如果您的教授确实在教“现代C ++”,那么请您进一步困惑,然后会警告您不要随意使用原始指针:

What is a smart pointer and when should I use one?

我将重申,您自己可以做的最好的事情就是不要尝试通过在Internet上搜索解决方案来实现捷径。从一开始就遵循您的课程工作,如果您觉得自己的课程或教授缺乏,那么可以通过自己a good book来补充自己的教育。