dynamische objektorientierte datenstruktur
-
HALL0.
ich habe folgende frage, zu dem ich ein paar tips bräuchte. und zwar möchte ich mir eine eigene datenstruktur schreiben, die mir bei folgendem problem behilflich ist:
ausgangspunkt ist ein foto, auf dem ein paar linien zu sehen sind. diese linien extrahiere ich durch diverse verfahren. was ich nun benötige, ist eine datenstruktur, in der ich die linien abspeichern kann. d.h., da die linien nicht zusammenhängen, möchte ich jede linie auch unter einem anderen index abspeichern, und unter jedem index sollen dann für alle pixel, die zu dieser linie gefunden wurden, x- und y-koordinaten gespeichert werden. des weiteren sollte es möglich sein, einzelne linien wieder zu löschen, falls sie bestimmten kriterien nicht genügen.
das ganze muss halt dynamisch sein, weil ich nicht weis, wie viele linien auf dem foto sind und wie vie viele pixel pro linie da sind.vielen dank für eure hilfe!
STICK.
-
Ich würde ja geschachtelte STL-Container verwenden, z.B. einen vector<vector<point> > (jeder Teilvektor entspricht einer gefundenen Linie). Eventuell auch mit Zwischenklasse für die leichtere Verarbeitung:
class point;//einzelner Bildpunkt class line { vector<point> punkte;//enthaltene Punkte public: void insert(const point& p) { punkte.push_back(p); } int find(const ppoint& p) { return find(punkte.begin(),punkte.end(),p)-punkte.begin(); } ... } vector<line> bild;
-
danke für die antwort. so in etwa habe ich mir das auch vorgestellt. leider fehlt mir aber auf dem gebiet der objektorientierten programmierung das wissen & erfahrung, darum kann ich deinen vorschlag nicht direkt nachvollziehen.
gibt es zu dieser problem im internet ein paar gute tutorials, wo ich mir das noch fehlende wissen aneignen kann?DANKE.
STEFAN.
-
Im Magazin (recht weit unten im Hauptboard zu erreichen) findest du meine Artikel zum Thema "Aufbau der STL", da steht auch einiges zu den Containerklassen drin.
Und zu der vorgeschlagenen Struktur:
- Ein Punkt (point) bietet alle Funktionen, dier er halt benötigt.
- Eine Linie enthält eine Reihe von Punkten (als vector<>) und kann Punkte einfügen (push_back()), suchen (find()) und auch wieder rausschmeißen (remove())
- Das gesamte Bild besteht wiederum aus mehreren Linien (auch wieder in einem Vektor) und kann genauso erweitert und umgebaut werden.
(und um die Linie zu einem Punkt zu suchen, benötigst du find_if() und eine passende Vergleichfunktion:
bool is_in_line(const line& l,const point& p) { return l.find(p)!=l.anzahl(); //find() siehe oben, anzahl() enthält nur ein "return punkte.size();" } point p0; vector<line>::iterator = find_if(bild.begin(),bild.end(),bind2nd(ptr_fun(is_in_line),p0));
-
Schau mal ins Magazin. CStoll hat einen Artikel zur Einführung in die STL geschrieben. Da wird auch vector erklärt.
MfG Jester
-
danke für die beiden antworten.
mein problem besteht aber weniger im umgang mit vectoren. damit habe ich mich dank der beiden STL-artikel schon beschäftigen können. problematisch und noch weniger erfahren bin ich im aufbau einer neuen klassen mitsamt ihren methoden. darüber würde ich gerne mehr lesen.
DANKE.
STEFAN.
-
Schau doch in ein Tutorial oder ein Buch (du wirst doch eins haben).
z.Bsp.
http://tutorial.schornboeck.net/inhalt.htm
In Kapitel 6 wird unter anderem auch über Klassen geschrieben.
-
OK, dann ein paar Grundlagen:
Eine Klasse besteht aus einzelnen Methoden (davon sind idrR die meisten öffentlich) und Membervariablen (sollten eigentlich privat bleiben). Ein Anwender erstellt ein Objekt dieser Klasse und kann danach auf dessen Methoden zugreifen (die wiederum die Elemente des Objekts lesen oder verändern können).
Z.B. hat die obige Klasse 'line' ein Element namens 'punkte', in dem es die eigenen Bildpunkte verwaltet (ist privat, also nur für die eigenen Methoden sichtbar) und Methoden zum Einfügen, Suchen und Löschen von Punkten (diese greifen auf die Punkteliste zu).
('point' würde wiederum zwei Membervariablen für die Koordinaten und einen Satz Zugriffsmethoden und Vergleichsoperatoren bereitstellen)
-
@CStoll:
danke für die kurze erläuterung. dazu muss ich aber sicher noch mehr lesen, um es richtig anwenden zu können.@Braunstein:
ein buch habe ich schon, aber nur über C, und dass ist ja, soweit ich weis, keine objektorientierte sprache. und vor ort komme ich hier nicht an deutsche bücher ran. darum meine frage nach ein paar guten links. der, denn du mir empfohlen hast, scheint auf den ersten blick auch hilfreich zu sein. danke.STICK.
-
Oben auf dieser Seite gibt es einen Link "Tutorials" und einen "Bücher". Klick da einfach mal drauf.
Viel Spass damit.
PS.
Der Link "für Neulinge" ist auch ganz interessant.
-
HALLO.
ich habe soeben meine ersten versuche mit vectoren und klassen gemacht. leider funktioniert es nicht so, wie ich es mir wünschen würde. der folgende code funktioniert zwar, aber dessen umsetzung finde ich nicht sonderlich gelungen. gibt es bessere lösungen, ohne "resize" und dafür push_back u.a. verwenden zu können?
class point { public: int itsX; int itsY; }; class line { public: vector <point> PKT; void add (int i, int j) { // ... push_back()... ? }; }; int main() { vector <point> TEST; TEST.resize(100); TEST[0].itsX=0; TEST[0].itsY=1; return 0; }DANKE.
STICK.
-
Mit push_back() wird doch der Vector autom. vergrößert, ein resize brauchst du in den seltensten Fällen. Außer du willst mit Resize z.B. 100 Einträge haben. Das was du vielleicht suchst, ist reserve()? Damit kannst du schon mal Speicher vorreservieren.
Obwohl das, was du gemacht hast auch nicht falsch ist.
-
aber wie und wo soll ich denn das push_back() einbringen?
so gehts leider nicht:
TEST[0].push_back(); TEST.push_back();STICK.
-
Erstmal ist es eine gute Idee, der Klasse point einen Konstruktor zu spendieren. Und zweitens mußt du bei push_back() das Objekt mitgeben, das du anlegen willst:
//mit deinen Klassen: point p = {0,1};//ohne Ctor funktioniert die Initialisierungsliste Test.push_back(p); //mit Ctor: class point { public: point(int nx,int ny) : x(nx),y(ny) {} int getx() {return x;} int gety() {return y;} ...//Vergleiche, evt. setx/sety private: int x,y; }; ... vector<point> Test; Test.push_back(point(0,1));//mit Ctor-Aufruf und Temporary
-
Hallo
so gehts leider nicht:
ist keine ausreichende Fehlerbeschreibung.
TEST.push_back(/* neues Element */);Übrigens gibt es hier im Forum schon einen Haufen Threads zum Thema vector...
Zum Beispiel den Magazinartikel.bis bald
akari
-
@CStoll:
ja, ich habe total vergessen das objekt in die klammer zu schreiben. das lag daran, dass ich nicht richtig wusste, welcher art dieses objekt sein soll. dein code scheint auf den ersten blick logisch zu sein. wenn ich am montag wieder an meinem rechner sitze, werde ich das so in mein programm einbauen. danke.ich habe auch gerade gelesen, dass man einen konstruktor und destruktor nicht unbedingt in einer klasse integrieren muss, da C++ einen standardkonstruktor verwendet. in wie weit wuerdest du dem zustimmen?
@Akari:
danke fuer den link, damit bin ich aber leider nicht mehr weiter gekommen, darum habe ich ja meine frage gepostet.gruesse,
STICK.