Реализация универсальной коллекции для стека - PullRequest
0 голосов
/ 18 сентября 2018

При указании типа данных при создании стеков я сталкивался с двумя различными реализациями.

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 голосов
/ 18 сентября 2018

Когда я искал в Интернете решения

Это твоя проблема. Не пытайтесь искать в Интернете и копировать / вставлять код, который вы не понимаете. Это для после вы закончили.

Я нашел код

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

Это не скомпилируется. new предназначен для динамического распределения и возвращает указатель . То, что у вас слева (Stack<string> stringStack), не является указателем.

«Таинственный» *, который вы видите, комментируя левую часть (в правильном коде), обозначает указатель. Когда он не является частью типа, это оператор разыменования , что означает «посмотрите, на что указывает этот указатель».

Динамическое выделение памяти должно быть выполнено в парах ... a new и delete, в противном случае у вас будет утечка. Кратко продемонстрировано:

{ // 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

Здесь обсуждается вопрос о том, следует ли вам динамически выделять что-то или нет, и, возможно, вы найдете в нем что-то ценное:

Почему я должен использовать указатель, а не сам объект?

Но, чтобы еще больше сбить вас с толку, если ваш профессор действительно преподавал "современный C ++", то вас предупредили бы о случайном использовании необработанных указателей:

Что такое умный указатель и когда его следует использовать?

Я повторю, что лучшее, что вы можете сделать для себя, - это не пытаться использовать ярлыки, ища решения в Интернете. Следуйте своей курсовой работе с самого начала, и если вы чувствуете, что ваш курс или профессор не хватает, дополните свое образование, пройдя самостоятельно хорошую книгу .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...