Also gehts nur an nem "beispiel"
Du musst "irgendwie" eine Liste mit Namen speichern(im Speicher)
Dein Ansatz waer also:
Code: Alles auswählen
std::vector<std::string> myAdressList;
// ... irgendwann irgendwas einfuegen
myAdressList.push_back("Horst Berger");
// ....
/// ... durchlaufen wuerdest du Dann so:
///
for(init i = 0; i < myAdressList.size(); ++i)
{
std::cout << myAdressList[i] << std::endl;
}
Aber jetzt stell dir mal vor, du musst 100000 elemente da reinpumpen ...
was passiert ?
1. std::string iss ne speicherklasse, das heisst die haelt nur verwaltungsinfos + nen zeiger auf weiteren speicher, wo die eigentlichen daten stehen
2. std::string benutzt keine impliziete optimierung, ein kopieren eines strings ist also immer eine tiefe kopie, oder deine STL Impl haelt sich ned an den standard.
3. dein vector hat ne (vorhalte)basisgroesse von einigen T (typ was im vector steht), wenn der volllaeuft, muss der vector expandieren.
4. expandieren implementieren die meisten STL_Impls in dem sie Speicher doppelter groesse anfordern, das zeug rueberkopieren, den alten bereich loeschen (daten muessen ja immer hintereinander liegen)
5. also schatzen wir mal beim 10. 20. 40. 80. 160. ... Einfuegen, bricht die performance des einfuegens ein. Am anfang nur ganz wenig, aber um so mehr elemente drinne sind, um so seltener, aber um so drastischer wird der Einbruch.
Dabei iss das ganze komplett unnoetig. warum ?
ausser in der schleife verwendest du den indexoperator nicht ...
wenn du die schnelligkeit des indexoperators, und die notwqendigkeit der bLockweissen anordnung der Daten (c-kompatiblitaet) eliminieren kannst, iss ein vector total unnötig.
das schnellste einfügen der daten bietet dir die liste.
weiterhin garantiert dir die liste schnellstmöglich einen komplettdurchlauf durch alle elemente (komplette iteration).
index zugriff kann man nachprogrammieren, der iss aber dann nicht wirklich effizient, sollte man daher auch nicht.
Und die daten liegen nicht en block vor (verkettete liste halt).
Code: Alles auswählen
std::list<std::string> myAdressList;
// ... irgendwann irgendwas einfuegen
myAdressList.push_back("Horst Berger");
// ....
/// ... durchlaufen wuerdest du Dann so:
///
for(std::list<std::string>::const_iterator it = myAdressList.begin(); it != myAdressList.end(); ++it)
{
std::cout << (*it) << std::endl;
}
Das staendige kopieren der kompletten string (holder + daten) wuerde entfallen.
Das ganze iss nun eben sehr theorethisch.
nen praktisches beispiel:
ich krieg hier staendig messdaten, bestehend aus nen zeitstempel (int64) und nen messwert(8 Byte datenblock), so ca. 8000 - 60000 pro sekunde in echtzeit.
DIe muss ich kurz bearbeiten und dann wegdumpen.
das wegdumpen iss ne FileIO operation, die kann also boese verzoegern.
die hardware hat nur nen puffer von paar 100Byte, die kann grad mal ne zehtelsekunde zwischenpuffern.
ich muss also selber puffern ... was werd ich wohl als puffer nehmen ?
vector ginge, wenn ich den gross genug vordimensionier (ne art ringpuffer).
Aber wehe ich verschaetze mich mal und er iss kleiner als benoetigt -> expandieren -> resize -> kann paar zehntel sek dauern -> datenverlust !
entweder verschlampe ich speicher wie doof, oder ich nehm was anderes. ne queue (also liste) bietet sich da formlich an !
Ciao ...