std :: queue является адаптером для другого контейнера (который реализует front, back, push_back и pop_front), если вы не укажете, какой контейнер нужно адаптировать, он будет использовать std :: deque. Deque выполняет некоторую магию выделения блоков в фоновом режиме, которая должна обеспечивать изменение размера, аналогичное вектору, но работает лучше, поскольку она управляет несколькими несмежными блоками и не должна копировать все при каждом изменении размера. Во всяком случае, это предположение, но я бы сказал, что причина.
Структура байтового массива чаще отражает попадания из-за освобождения места для всех этих массивов, я бы поспорил, что в более широком масштабе структура строки также будет генерировать пики, теперь она просто меньше, поскольку строка, вероятно, поддерживает ссылки на нижележащий элемент хранение символов, пока что-то не изменится.
Теперь у вас есть шанс познакомиться с вашим профилировщиком и узнать наверняка! Запустите valgrind (--callgrind) или любой другой профилировщик, который поддерживает ваша платформа, и посмотрите, какие вызовы используют время и где.