Почему это говорит о том, что мой 'Destroystack' не объявлен? - PullRequest
0 голосов
/ 12 марта 2011
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main()
{
 string name;
 double gpa;
 double high = 0;
 stack<string>names;
 for (int i=0;i<7;i++)
{
 cout << " Enter student's name and gpa " <<endl;
 cin >> gpa ;
 cin >> name ;
 if (gpa > high)
{
 names.destroyStack();
 high = gpa;
 names.push(name);
 }
 else
   if (gpa==high)
  {
   names.push(name);
  }
 }
 cout << "Highest gpa is " << high << "Names with the highest gpa are"<< endl;
 while (!names.empty)
 {
   cout <<  names.top() << endl;
   names.pop();
 }
 return 0;
 }

Чтобы отобразить только имена с самым высоким значением gpa, я должен поставить код для удаления стека ранее с более низкими значениями gpa. Поэтому для этого я подумал, что могу использовать операцию "destroystack ()"но когда я использую это и пытаюсь выполнить, компилятор говорит, что destroyStack не был объявлен в области видимости.

Это И нижний, где я хочу отобразить стек. Это даже говорит, что пустое не былоне объявленоЯ запутался в этих ошибках и не знаю, что это значит, объявляя операции?Я использую кодовые блоки (не Visual Studio), так что это влияет на что-нибудь?

Ответы [ 3 ]

3 голосов
/ 12 марта 2011

Потому что, просто, такой функции нет destroyStack в std::stack. Я понятия не имею, откуда у вас идея, что там есть.

1 голос
/ 12 марта 2011

Этот код должен работать, чтобы очистить ваш стек:

заменить:

  names.destroyStack();

с:

  while (!names.empty())  
  {
    names.pop();  
  } 

Как видите, empty - это функция; он возвращает значение. В этом случае он возвращает логическое значение (истина / ложь), поэтому вам нужно иметь круглые скобки после него, чтобы вызвать его.

Вот почему вы получаете сообщение о том, что пустое не объявлено; это означает, что компилятор ищет переменную с именем empty, но она не существует. Добавляя парены, вы говорите, что хотите вызывать функцию, а не обращаться к переменной.

«Цикл while» перебирает все элементы в стеке, пока стек не станет пустым. Это фактически означает, что для каждого элемента, который находится в стеке, элемент «pop'd» отключен (pop также является функцией, но он возвращает элемент, который был в стеке). В конце концов, в стеке ничего не осталось, и цикл while завершается, поскольку empty () возвращает true.

Чтобы узнать, какие функции и свойства имеет шаблон стека, проверьте: http://www.cppreference.com/wiki/container/stack/start

1 голос
/ 12 марта 2011

Вы должны реализовать этот destroyStack самостоятельно.Такая функция, как:

void destroyStack(stack<string>& _stack)
{
  // Do whatever
}

И вызывать ее с помощью:

destroyStack(names);

empty должен быть пустым () вместо этого.

Ваш редактор, кодовые блоки или Visual Studio,ни на что не влияет.

...