решение выводить каждый первый элемент, разрушать его, выводить следующий, как первый и т.д. Но может есть какое-то другое решение?
У queue нарошно убраны итераторы и осложнён доступ к его контейнеру. В ходу способ, предполагающий копирование очереди и деструктивные операции над копией.
хорошо, спасибо за совет)
Есть идея ещё лучше. Раз уж у нас есть такие требования, то лучше уж вместо queue использовать deque. Это тоже самое, но без ограничений.
какие отличия между ними помимо ограничений? в двух словах
queue - это интерфейс к контейнеру. По умолчанию таким контейнером является deque. Отсюда следует, что нет ничего такого, что умел бы queue, но не умел бы deque. На самом деле, мне вообще не вполне понятно логика, зачем queue есть в стандартной библиотеке. Пусть коллеги нам подскажут.
Спасибо вам большое!
int main (int argc, char argv []) { std::queue<int> queue {std::deque<int> {1,2,3,5}}; std::deque<int> *deq = reinterpret_cast<std::deque<int> * > (&queue); for (int i = 0; i < queue.size() ; ++i) { std::cout << deq->at(i); } return 0 } ну можно конечно привести. но бить за такое будут больно и долго.
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Как вариант: https://gcc.godbolt.org/z/PaKrcEqdY А вот в законности такого трюка я уже не уверен: https://gcc.godbolt.org/z/PaKrcEqdY
А не используй queue. Бесполезное гавно
Нет, это UB
нет, это не UB в libstdc++ и libc++ https://godbolt.org/z/nTT3ozM39
Разумеется UB. Соответствие StandardLayoutType не дает права на такие реинтерпретации.
В отладке? Сам каст останется легальным недиагностируемым.
В отладке, конечно. Санитайзер поймает
Обсуждают сегодня