Печать элементов в очереди в другой функции не очищает очередь глобально в программе _start. Есть еще объяснения? - PullRequest
2 голосов
/ 01 ноября 2019

Возможно, это довольно простой вопрос, но я не могу понять, почему результат такой, какой он есть. Рассмотрим следующий простой код:

#include <iostream>
#include <queue>

void print_queue(std::queue<int> q)
{
    while( !q.empty() )
    {
       std::cout << q.front();
       q.pop();
    }
    std::cout << std::endl;
    std::cout << "The size of the queue in the print function: " << q.size() << std::endl;
}


int main() {

   std::queue<int> my_queue;
   for ( const int &item : {1, 2, 3, 4, 5, 6, 7} )
   {
       q.push(item);
   }
   print(my_queue);
   std::cout << "The size of the queue in the main loop: " << my_queue.size() << std::endl;

   return 0;
}

Ожидаемый результат этого будет:

1 2 3 4 5 6 7
The size of the queue in the print function: 0
The size of the queue in the main loop: 7

Мой вопрос заключается в том, почему нет побочного эффекта в очереди, которую я пытаюсь распечатать,Разве очередь не должна была быть пустой в оба раза, когда размер был распечатан?

1 Ответ

1 голос
/ 01 ноября 2019

Функция print_queue и функция main работают с двумя разными очередями. Вы должны пройти очередь в основном по ссылке.

То есть параметр функции print_queue является ссылочным типом. Например,

void print_queue(std::queue<int> &q)
                                 ^^

В противном случае функция работает с копией исходной очереди. В результате исходная очередь не изменяется.

...