Ich habe eine Klasse, die wie folgt aussieht:Gibt es ein Äquivalent von vector :: reserve() für eine std :: list?
typedef std::list<char*> PtrList;
class Foo
{
public:
void DoStuff();
private:
PtrList m_list;
PtrList::iterator m_it;
};
Die Funktion DoStuff()
grundsätzlich Elemente m_list
hinzufügt oder löscht Elemente daraus, findet einen Iterator zu einem besonderen Element in sie und speichert sie in m_it
. Es ist wichtig zu beachten, dass jeder Wert von m_it
in jedem folgenden Anruf von DoStuff()
verwendet wird.
Also, was ist das Problem? Alles funktioniert, außer dass die Profilerstellung zeigt, dass der Operator new
wegen list::push_back()
aufgerufen von DoStuff()
zu viel aufgerufen wird.
Leistung erhöhen ich für Speicher wollen m_list
in der Initialisierung von Foo
vorzubelegen, wie ich tun würde, wenn es sich um eine std::vector
waren. Das Problem ist, dass diese neue Probleme einführen würde, wie:
- Weniger effiziente
insert
underase
von Elementen. m_it
wird ungültig, sobald der Vektor von einem Aufruf zuDoStuff()
zum nächsten geändert wird. EDIT: Alan Stokes vorgeschlagen, einen Index anstelle eines Iterators zu verwenden, dieses Problem zu lösen.
Meine Lösung: die einfachste Lösung, die ich denken könnte, ist ein Pool von Objekten zu implementieren, die auch eine verknüpfte Liste Funktionalität. Auf diese Weise bekomme ich eine verkettete Liste und kann Speicher dafür vorbelegen.
Fehle ich etwas oder ist es wirklich die einfachste Lösung? Ich möchte das Rad nicht "neu erfinden" und stattdessen eine Standardlösung verwenden, falls diese existiert.
Alle Gedanken, Umgehungslösungen oder aufschlussreiche Kommentare würden uns freuen!
Wofür verwenden Sie diese Zeichen * genau? – ScarletAmaranth
@ScarletAmaranth Dies sind Zeiger auf Orte im Speicher, wo Datenpakete gespeichert werden (ich habe es für die Frage auf char * vereinfacht). –
Haben Sie überprüft, ob es tatsächlich besser funktioniert, wenn Sie nur einen 'Vektor' verwenden? Es könnte gut tun; Eine schnelle Zuweisung und ein gutes Cache-Verhalten machen die Einfüge-/Löschkosten oft wett. –