Grundsätzlich std::queue
ist ein Adapter Container - es ist kein eigener Container, sondern eine dünne Verpackung um andere Container.
Zum Beispiel können Sie einen Blick auf der Warteschlange Unterschrift geleistet werden:
template <class T, class Container = deque<T> > class queue;
wie Sie sehen können, T
ist der Typ des in der Warteschlange gespeichert Elements und Container
sind die zugrunde liegenden Behälter.
und das ist die Antwort auf Ihre Frage: verschiedene Container behandelt Speicher anders. die zugrunde liegende deque kann schrumpfen oder nicht, aber es liegt an der innenseite zu entscheiden.
können Sie auch std::list
als zugrunde liegenden Container verwenden. In diesem Fall löscht jeder Popup den zugrunde liegenden Listenknotenspeicher.
Sie können auch eigene Dateien schreiben oder vorhandene Container ändern, um sie an Ihre eigenen Speicherverwaltungsmuster anzupassen. Ihr Container muss einige Methoden unterstützen (suck as push_back
, pop_front
), die Sie in der entsprechenden Online-Dokumentation lesen können. Hier
ist ein Beispiel an einen deque
Adapter, der alle 1024 pop
Anrufe in Kapazität schrumpft:
template<class T>
class DequeAdapater{
private:
std::deque<T> m_Deque;
size_t m_PopCount;
public:
DequeAdapater():
m_PopCount(0){}
bool empty() const noexcept{
return m_Deque.empty();
}
size_t size() const noexcept{
return m_Deque.size();
}
T& front() noexcept{
return m_Deque.front();
}
const T& front()const noexcept{
return m_Deque.front();
}
T& back() noexcept{
return m_Deque.back();
}
const T& back()const noexcept{
return m_Deque.back();
}
void push_back(const T& t){
return m_Deque.push_back(t);
}
void push_back(T&& t){
return m_Deque.push_back(std::move(t));
}
void pop_front(){
m_Deque.pop_front();
m_PopCount++;
if (m_PopCount%1024U == 0U){
m_Deque.shrink_to_fit();
}
}
}
template <class T>
using LeanQueue = std::queue<T,DequeAdapater<T>>;
Anmerkung jedoch nicht, dass in der Kapazität schrumpfen bedeutet Verschieben oder Kopieren der Warteschlangenelemente auf den neuen mageren Brocken, die Der Speicherverbrauch ist geringer, aber die Leistung kann sich verschlechtern.
Es gibt auch die ganze Sache, dass, selbst wenn Sie den Speicher als frei an die C++ - (und C) Laufzeit zurückgeben, wird diese Laufzeit wahrscheinlich nicht direkt zurück zum Betriebssystem, so wird das Programm konsumiere diesen Speicher immer noch, soweit es das Betriebssystem betrifft. – Angew