Array vs Vector vs ...
-
Hallo,
das Folgende habe ich vor.Ich habe Börsenkurse zu 110 verschiedenen Aktien und will diese nun alle in mein Programm so laden, dass sie permanent verfügbar sind. Dabei ist zu beachten, dass unterschiedlich lange Zeitreihen vorliegen, man kann also nicht einfach ein Array der Länge x nehmen.
Die Struktur der Daten ist folgende:
Date,Open,High,Low,Close,Volume,Adj. Close*Was schlagt ihr vor?
Grüße,
Michael
-
Dann nim doch ne Liste, oder was suchst Du?
Gruß Matthias
-
Dynamsiche Container wie std::vector lösen das Problem doch für Dich!
-
Ich bin irgendwie davon ausgegangen, dass man keine CListCtrl-Arrays anlegen kann, was falsch war. Ich löse es jetzt damit.
Danke,
Michael
-
Hallo,
leider muss ich dieses Thema nochmal aufbringen.Ich hatte das Problem bisher so gelöst:
CListCtrl* stockDB; // Schritt 2: stockDB initiieren stockDB = new CListCtrl[symbols_count]; for (int i = 0; i < symbols_count; i++) { // stockDB[i].Create(WS_CHILD|WS_VISIBLE|LVS_REPORT, CRect(250*i,100,(250*i)+200,400), this, i); stockDB[i].Create(WS_CHILD|WS_MINIMIZE|LVS_REPORT, CRect(-1,-1,-1,-1), this, i); for(int g=0; g<col_labels.GetSize();g++) { stockDB[i].InsertColumn(g, col_labels[g], LVCFMT_LEFT, 90); } }Ich habe also ein Array, über das ich auf eine dynamische Anzahl von CListCtrl's zugreife. Jede CListCtrl hat dabei die Daten eines Wertpapiers aufgenommen.
Nachdem ich nun seit Wochen an dem Programm schreibe, muss ich leider feststellen, dass die aktuelle Lösung extrem schlecht ist, da 1. der Zugriff beim einlesen der Daten zu lange dauert und 2. wenn das Programm beendet wird, ich über delete[] stockDB; das Array lösche, was allein ca. 5 Sekunden dauert und außerdem manchmal zu Memory Leaks führt.
Es muss also eine deutlich bessere Lösung her. Welche?
Ich hatte mir überlegt, ein struct passend zu meinen Datenssätzen zu schreiben (Date, High, Low etc.) und dann einen Vector mit diesem Datentyp anzulegen aber ich will nicht die Kursdaten aller Unternehmen in einem Vector haben.
Ich brauche dringend eure Hilfe!
Danke,
Michael
-
CListCtrl ist nicht bekannt für ne Riesenperformance.
Außerdem erzeugst Du mit jedem Eintrag einen großen Overhead. Du hast 110 Aktien * 250 Kurstage * x Jahre.
Die von der Erzeugungszeit und Zugriffszeit her beste Lösung wäre es ein struct mit Open,High,.. zu erzeugen und den Steicherplatz direkt mit malloc zu erzeugen.
Praktischer gehts natürlich mit nem vektor oder einer liste der standard library.
std::vector<structname> VectorName
oder
std::list<structname> ListNameDu mußt dich dann entscheiden was besser ist.
Allerdings wird die Erzeugung bei großen Datenmenge mit der std auch das etwas Zeit in Anspruch nehmen, aber nicht so lange wie mit ner CListCtrl.Babbage
-
Über diese Variante habe ich auch schon nachgedacht:
std::vector<structname> VectorNameAber das ganze muss gut organisiert sein.
Ist es möglich einen Vector anzulegen, über den ich einen weiteren Vector ansprechen kann, in dem dann die Daten liegen?also z.B.
db1[0].stockdata[0]
in db1 liegen alle Vectorern und in stockdata die Kursdaten.
-
std::vector< std::vector<structname> > VectorName;
oder
std::vector<structname> VectorName[110];
Zugriff dann:
VectorName[i][j]=struct;Geht beides.
Noch was. Fall Dir voher bekannt ist wie groß der Verktor wird kannst Du ihn mit resize auf die geplante Größe setzen.
Dann wird er nicht 10000 mal verlängert.Babbage
-
Klasse, werde ich heute Abend testen. Vielen Dank!!!
-
std::vector< std::vector<data> > data1_db;
führt zu:
--------------------Konfiguration: Sherlock - Win32 Debug--------------------
Kompilierung läuft...
communication.cpp
c:\programme\microsoft visual studio\vc98\include\utility(21) : warning C4786: 'std::reverse_iterator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > const *,std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std
::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > const &,std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > const *,int>' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen reduziert
c:\programme\microsoft visual studio\vc98\include\utility(21) : warning C4786: 'std::reverse_iterator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > *,std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::vect
or<CSherlockDlg::data,std::allocatorCSherlockDlg::data > &,std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > *,int>' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen reduziert
Generieren von Code...
Kompilieren...
Sherlock.cpp
c:\programme\microsoft visual studio\vc98\include\vector(60) : warning C4786: 'std::reverse_iterator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > const *,std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std:
:vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > const &,std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > const *,int>' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen reduziert
c:\programme\microsoft visual studio\vc98\include\vector(58) : Bei der Kompilierung der Member-Funktion '__thiscall std::vector<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::allocator<std::vector<CSherlockDlg::data
,std::allocatorCSherlockDlg::data > > >::~std::vector<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::allocator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > > >(void)' der Klassenvorlage
c:\programme\microsoft visual studio\vc98\include\vector(60) : warning C4786: 'std::reverse_iterator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > *,std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::vecto
r<CSherlockDlg::data,std::allocatorCSherlockDlg::data > &,std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > *,int>' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen reduziert
c:\programme\microsoft visual studio\vc98\include\vector(58) : Bei der Kompilierung der Member-Funktion '__thiscall std::vector<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::allocator<std::vector<CSherlockDlg::data
,std::allocatorCSherlockDlg::data > > >::~std::vector<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::allocator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > > >(void)' der Klassenvorlage
SherlockDlg.cpp
c:\programme\microsoft visual studio\vc98\include\vector(39) : warning C4786: 'std::reverse_iterator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > const *,std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std:
:vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > const &,std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > const *,int>' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen reduziert
c:\programme\microsoft visual studio\vc98\include\vector(39) : Bei der Kompilierung der Member-Funktion '__thiscall std::vector<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::allocator<std::vector<CSherlockDlg::data
,std::allocatorCSherlockDlg::data > > >::std::vector<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::allocator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > > >(const std::allocator<std::vector<CSherl
ockDlg::data,std::allocatorCSherlockDlg::data > > &)' der Klassenvorlage
c:\programme\microsoft visual studio\vc98\include\vector(39) : warning C4786: 'std::reverse_iterator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > *,std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::vecto
r<CSherlockDlg::data,std::allocatorCSherlockDlg::data > &,std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > *,int>' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen reduziert
c:\programme\microsoft visual studio\vc98\include\vector(39) : Bei der Kompilierung der Member-Funktion '__thiscall std::vector<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::allocator<std::vector<CSherlockDlg::data
,std::allocatorCSherlockDlg::data > > >::std::vector<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::allocator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > > >(const std::allocator<std::vector<CSherl
ockDlg::data,std::allocatorCSherlockDlg::data > > &)' der Klassenvorlage
Generieren von Code...
c:\programme\microsoft visual studio\vc98\include\vector(39) : warning C4786: 'std::vector<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::allocator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > > >::ve
ctor<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::allocator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > > >' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen verkürzt
c:\programme\microsoft visual studio\vc98\include\vector(60) : warning C4786: 'std::vector<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::allocator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > > >::~v
ector<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::allocator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > > >' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen verkürzt
c:\programme\microsoft visual studio\vc98\include\vector(60) : warning C4786: 'std::vector<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::allocator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > > >::~v
ector<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data >,std::allocator<std::vector<CSherlockDlg::data,std::allocatorCSherlockDlg::data > > >' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen verkürzt
Linker-Vorgang läuft...Sherlock.exe - 0 Fehler, 9 Warnung(en)
--
Kann mir das jemand erklären bzw. sagen, wie ich die Warnung wegbekomme?
-
Die Warnungen kann man nur per
#pragma warning(disable:4786)
ignorieren.
-
Aber warum taucht die Warnung auf?
-
Und warum werden in einer MFC-Anwendung nicht die Rutinen und Operatoren des Vectors angezeigt, wenn man diesen global definiert hat?
ich meine:
vector1[0].push_back ... Nachdem man den . (Punkt) drückt, erscheint doch sonst ein Kästchen, wo alle Rutinen etc. drinstehen.
Grüße,
Michael
-
IntelliSense funktioniert nicht zuverlässig. Wenn du das zuverlässig haben willst musst du dir Visual Assist X kaufen.
-
Kay, thx
-
Zu beiden Fragen (doofe Warnung und IntelliSense Versagen): weil du immer noch Visual C++ 6 verwendest.
Die Warnung kannst du im übrigen getrost ignorieren, die besagt nur dass der Name in der Debug-Info "beschnitten" werden, weil VC 6 zu doof ist lange Namen in der Debug-Info zu speichern. Keine Ahnung wieso - vielleicht haben sich die auch nur gedacht "255 Zeichen reicht eh locker"...
Und das #pragma warning(disable:4786) sollte am besten ganz am Anfang des Programmes stehen, also falls du Precompiled-Headers verwendest auch ganz oben in der "stdafx.h". Sonst funktioniert es nämlich nicht. Frag mich aber bloss nicht wieso...
-
#pragma warning( disable : 4786 )
-
hustbaer schrieb:
Und das #pragma warning(disable:4786) sollte am besten ganz am Anfang des Programmes stehen, also falls du Precompiled-Headers verwendest auch ganz oben in der "stdafx.h". Sonst funktioniert es nämlich nicht. Frag mich aber bloss nicht wieso...
Der Präprozessor arbeitet zeilenorientiert, deshalb schaltet dieses #pragma die Warnungen von dem Punkt an aus, an dem es steht (bis zum Ende der Datei oder bis zum zugehörigen
#pragma warning(default:4786)). In Headern, die du vorher schon eingebunden hattest, kommt die Warnung trotzdem vor.Zum Sinn DIESER Warnung: Der Debugger von VC kann keine unbegrenzt langen Bezeichner lesen, deshalb werden diese entsprechend abgeschnitten (zusammen mit einem Hinweis für den Programmierer). Und gerade in der STL kann da einiges zusammenkommen, wenn die typedefs und Default-Parameter für die STL-Klassen aufgelöst werden.