Итерация по очереди std - PullRequest
8 голосов
/ 01 июня 2010

Я пытаюсь использовать BOOST_FOREACH для итерации по очереди std :: queue. Но в этом классе нет итераторов, потому что у меня ошибка:

std::queue<std::string> someList;
BOOST_FOREACH(std::string temp, someList)
{
   std::cout << temp;
}

>no matching function for call to begin(...)
>no type named ‘iterator’ in ‘class std::queue<std::basic_string<char> >’

Мне нужно по структуре: первое приходит, первое уходит.

Ответы [ 3 ]

19 голосов
/ 01 июня 2010

std::deque поддерживает эффективную вставку и удаление в начале и конце структуры данных. Вы можете выполнять операции с очередями вручную, используя push_back и pop_front.

Очередь использует внутреннюю очередь по умолчанию. Это обертка, которая предоставляет только операции с очередями (поэтому вы не можете выполнять итерации по ней). Я задал подобный вопрос некоторое время назад, и лучший ответ дал мне хорошее представление о реальном использовании std::queue. Нужно использовать std::queue не потому, что нужна очередь, а чтобы прояснить, что в данной структуре данных допустимы только подобные очереди операции. Похоже, вам нужно больше свободы, чем это, поэтому используйте deque, list или какую-либо другую структуру с O (1) вставкой и удалением с обоих концов.

4 голосов
/ 01 июня 2010

вы можете использовать std :: list с push_front и pop_back

1 голос
/ 01 июня 2010

std::queue - это контейнерный адаптер. Он использует std::deque в качестве основного контейнера по умолчанию. Доступ к этому контейнеру невозможен и, следовательно, не является итерацией.

Лучший способ - использовать std::deque или std::list и управлять поведением очереди самостоятельно. Возможно предоставьте свою собственную обертку вокруг этого.

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