C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Sortieren von Objekten in Vektor

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Marten Weber
Guest





PostPosted: Thu Nov 06, 2003 4:15 pm    Post subject: Sortieren von Objekten in Vektor Reply with quote



Hi

Habe folgende Klasse:

#include "mySettings.h"
//***************Klasse für Elemente
//Methoden

void c_Elemente::set_nr (long int xnr) {m_nr = xnr; }
void c_Elemente::set_e1 (long int e1c) {m_e[0] = e1c; }
void c_Elemente::set_e2 (long int e2c) {m_e[1] = e2c; }
void c_Elemente::set_e3 (long int e3c) {m_e[2] = e3c; }
void c_Elemente::set_e4 (long int e4c) {m_e[3] = e4c; }
void c_Elemente::set_fP (int fIstPartnerc) {m_fIstPartner = fIstPartnerc;}

void c_Elemente::set_nreeee (long int nrc,long int e1c, long int e2c,
long int e3c, long int e4c)
{
m_nr = nrc;
m_e[0] = e1c;
m_e[1] = e2c;
m_e[2] = e3c;
m_e[3] = e4c; //Bleibt vorerst null, ist ja doppelt belegt
}
void c_Elemente::set_nreeee_s (long int nrc,long int e1c, long int e2c,
long int e3c, long int e4c)
{
m_nr = nrc;
m_e[0] = e1c;
m_e[1] = e2c;
m_e[2] = e3c;
m_e[3] = e4c; //Bleibt vorerst null, ist ja doppelt belegt
//Aufsteigend sortieren
if (m_e[0] > m_e[1]) vertausche_li(m_e[0],m_e[1]);
if (m_e[1] > m_e[2]) vertausche_li(m_e[1],m_e[2]);
if (m_e[0] > m_e[1]) vertausche_li(m_e[0],m_e[1]);
}

long int c_Elemente::get_nr() {return m_nr;}
long int c_Elemente::get_e1() {return m_e[0];}
long int c_Elemente::get_e2() {return m_e[1];}
long int c_Elemente::get_e3() {return m_e[2];}
long int c_Elemente::get_e4() {return m_e[3];}
int c_Elemente::get_fP() {return m_fIstPartner;}
//long int c_Elemente::get_eeee () {return m_e[];}


//Konstruktor

c_Elemente::c_Elemente ()
{
m_nr=0; //***Mit 0 initialisieren
for (int i=0;i<=3;i++)
m_e[i]=0;
m_fIstPartner=0;
}
//Destruktor

c_Elemente::~c_Elemente()
{
}


Instanzen werden dann so gebildet: (Die Anzahl steht noch nicht fest)

std::vector
Später wird der Vektor dann richtig dimensioniert und mit Werten gefüllt

vecDElemente.resize(liAnzElemente+1);

Die Daten sehen so aus.... können bis zu 100000 Instanzen werden
Nr E1 E2 E3 E4
1 4 9 7 7

2 6 2 7 7

3 3 7 2 2

4 7 5 6 6

E1-E4 sind Knotennummern Nr ist die Elementnummer.

Jetzt das eigentliche Problem:

In diesen Daten muss ich das Element finden welches 2 Knoten beinhaltet.
Bis jetzt geh ich in einer Schleife einfach alles durch. Dies möchte ich
effizienter gestalten.

Wie kann ich die Klassen zB mit Quicksort sortieren und danach darin
effizient suchen ?

Bin für jeden Tip dankbar

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Ludwig Pumberger
Guest





PostPosted: Thu Nov 06, 2003 9:23 pm    Post subject: Re: Sortieren von Objekten in Vektor Reply with quote



Marten Weber schrieb:

Quote:
Habe folgende Klasse:

#include "mySettings.h"
//***************Klasse für Elemente
//Methoden

void c_Elemente::set_nr (long int xnr) {m_nr = xnr; }
void c_Elemente::set_e1 (long int e1c) {m_e[0] = e1c; }
void c_Elemente::set_e2 (long int e2c) {m_e[1] = e2c; }
void c_Elemente::set_e3 (long int e3c) {m_e[2] = e3c; }
void c_Elemente::set_e4 (long int e4c) {m_e[3] = e4c; }
void c_Elemente::set_fP (int fIstPartnerc) {m_fIstPartner =
fIstPartnerc;}

void c_Elemente::set_nreeee (long int nrc,long int e1c, long int e2c,
long int e3c, long int e4c)

Nur gut dass ich die Klasse nicht verwenden muss. Die sprechenden Namen
sind begeisternd.

Quote:

Instanzen werden dann so gebildet: (Die Anzahl steht noch nicht fest)

std::vector<c_Elemente> vecDElemente;

Später wird der Vektor dann richtig dimensioniert und mit Werten gefüllt

vecDElemente.resize(liAnzElemente+1);

Die Daten sehen so aus.... können bis zu 100000 Instanzen werden
Nr E1 E2 E3 E4
1 4 9 7 7

2 6 2 7 7

3 3 7 2 2

4 7 5 6 6

E1-E4 sind Knotennummern Nr ist die Elementnummer.

Jetzt das eigentliche Problem:

In diesen Daten muss ich das Element finden welches 2 Knoten beinhaltet.
Bis jetzt geh ich in einer Schleife einfach alles durch. Dies möchte ich
effizienter gestalten.

Wie kann ich die Klassen zB mit Quicksort sortieren und danach darin
effizient suchen ?

Definier dir ein Prädikat(im Minimalfall eine boolsche Funktion die zwei
c_Elemente übernimmt und sich wie ein kleiner verhält) und übergib
ebendieses an std::sort. Ein bestimmtes Element findet dann
std::lower_bound. Voraussetzung ist natürlich dass kleiner für deine
c_Elemente Sinn macht.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Albrecht Fritzsche
Guest





PostPosted: Fri Nov 07, 2003 9:02 am    Post subject: Re: Sortieren von Objekten in Vektor Reply with quote



Marten Weber wrote:
Quote:
Hi

Habe folgende Klasse:

Warum ist das eine Klasse?
(Schau DIr mal folgendes Interview an, Stroustrup hat da eine ganz
interessante Regel, ab wann eine Klasse ueberhaupt Sinn macht)
Quote:

#include "mySettings.h"
//***************Klasse für Elemente
//Methoden

void c_Elemente::set_nr (long int xnr) {m_nr = xnr; }
void c_Elemente::set_e1 (long int e1c) {m_e[0] = e1c; }
void c_Elemente::set_e2 (long int e2c) {m_e[1] = e2c; }
void c_Elemente::set_e3 (long int e3c) {m_e[2] = e3c; }
void c_Elemente::set_e4 (long int e4c) {m_e[3] = e4c; }
void c_Elemente::set_fP (int fIstPartnerc) {m_fIstPartner = fIstPartnerc;}

void c_Elemente::set_nreeee (long int nrc,long int e1c, long int e2c,
long int e3c, long int e4c)
{
m_nr = nrc;
m_e[0] = e1c;
m_e[1] = e2c;
m_e[2] = e3c;
m_e[3] = e4c; //Bleibt vorerst null, ist ja doppelt belegt
}

Bis hierher ist eine Klasse ja nur reiner Mehraufwand.

Quote:
void c_Elemente::set_nreeee_s (long int nrc,long int e1c, long int e2c,
long int e3c, long int e4c)
{
m_nr = nrc;
m_e[0] = e1c;
m_e[1] = e2c;
m_e[2] = e3c;
m_e[3] = e4c; //Bleibt vorerst null, ist ja doppelt belegt
//Aufsteigend sortieren
if (m_e[0] > m_e[1]) vertausche_li(m_e[0],m_e[1]);
if (m_e[1] > m_e[2]) vertausche_li(m_e[1],m_e[2]);
if (m_e[0] > m_e[1]) vertausche_li(m_e[0],m_e[1]);
}

Wenn ich das richtig sehe, ist das doch identisch mit set_nreeee() plus
die vertausche-Zeilen. Dies sollte man dann auch so schreiben

set_nreeee_s (long int nrc,long int e1c, long int e2c,
long int e3c, long int e4c)
{
set_nreeee(....);

//Aufsteigend sortieren
if (m_e[0] > m_e[1]) vertausche_li(m_e[0],m_e[1]);
if (m_e[1] > m_e[2]) vertausche_li(m_e[1],m_e[2]);
if (m_e[0] > m_e[1]) vertausche_li(m_e[0],m_e[1]);
}


Quote:

long int c_Elemente::get_nr() {return m_nr;}
long int c_Elemente::get_e1() {return m_e[0];}
long int c_Elemente::get_e2() {return m_e[1];}
long int c_Elemente::get_e3() {return m_e[2];}
long int c_Elemente::get_e4() {return m_e[3];}
int c_Elemente::get_fP() {return m_fIstPartner;}
//long int c_Elemente::get_eeee () {return m_e[];}

Ebenso ueberfluessig, wenn man eine Struktur waehlen wuerde bzw.
den Vektor public.

Quote:
Instanzen werden dann so gebildet: (Die Anzahl steht noch nicht fest)

std::vector<c_Elemente> vecDElemente;

Später wird der Vektor dann richtig dimensioniert und mit Werten gefüllt

vecDElemente.resize(liAnzElemente+1);

vector::resize() ist gut, aber wofuer ist dieses +1 in (liAnzElemente+1)

Quote:

Die Daten sehen so aus.... können bis zu 100000 Instanzen werden
Nr E1 E2 E3 E4
1 4 9 7 7

2 6 2 7 7

3 3 7 2 2

4 7 5 6 6

E1-E4 sind Knotennummern Nr ist die Elementnummer.

Jetzt das eigentliche Problem:

In diesen Daten muss ich das Element finden welches 2 Knoten beinhaltet.

Was heisst das? Dass die anderen Knoten 0 sind? Oder dass nur zwei
verschiedene Werte auftreten? Gibt es nur ein solches Element? Dann
wuerde ich doch gleich *nur* den Input lesen und mir die ganze "Klasse"
sparen.

Quote:
Bis jetzt geh ich in einer Schleife einfach alles durch. Dies möchte ich
effizienter gestalten.

Wie kann ich die Klassen zB mit Quicksort sortieren und danach darin
effizient suchen ?

Wie bzw. wonach sortieren? Das ist die wichtige Frage. Stelle ein
solches Praedikat auf - das also zwei Elemente nimmt und Deiner Ordnung
entsprechend ein bool-Resultat zurueckgibt.

std::sort(vecDElemente.begin(), vecDElemente.end(), DeinPraedikat());

sortiert dann den Vektor entsprechend.

Ali

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Albrecht Fritzsche
Guest





PostPosted: Fri Nov 07, 2003 9:21 am    Post subject: Re: Sortieren von Objekten in Vektor Reply with quote

Albrecht Fritzsche wrote:

Quote:
Warum ist das eine Klasse?
(Schau DIr mal folgendes Interview an, Stroustrup hat da eine ganz
interessante Regel, ab wann eine Klasse ueberhaupt Sinn macht)

Sorry, irgendwo ist der Link verloren gegangen

www.artima.com/intv/goldilocks3.html

Ali

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Marten Weber
Guest





PostPosted: Fri Nov 07, 2003 12:21 pm    Post subject: Re: Sortieren von Objekten in Vektor Reply with quote


Quote:

Die Daten sehen so aus.... können bis zu 100000 Instanzen werden
Nr E1 E2 E3 E4
1 4 9 7 7

2 6 2 7 7

3 3 7 2 2

4 7 5 6 6

E1-E4 sind Knotennummern Nr ist die Elementnummer.

Jetzt das eigentliche Problem:

In diesen Daten muss ich das Element finden welches 2 Knoten beinhaltet.

Was heisst das? Dass die anderen Knoten 0 sind? Oder dass nur zwei
verschiedene Werte auftreten? Gibt es nur ein solches Element? Dann
wuerde ich doch gleich *nur* den Input lesen und mir die ganze "Klasse"
sparen.


Es gibt immer nur 2 Elemente die 2 gleiche Knoten beinhalten. Die Elemente
sind Dreiecke.
In meinem Programm mache ich aus 2 Dreiecken die an ihrer längsten Seite
beieinander liegen
ein Viereckselement indem ich aus dem Nachbarelement den 4 Knoten in Element
1 einfüge. Ich habe jetzt vor meine Elemente aufsteigend nach E1 und dann
nach E2... zu sortieren um dann darin schnell das Element finden zu konnen
dass zB Knoten 100 und 236 benutzt.

Gibt es ein std::find o.ä. um das Element zu finden ? Ist dieses find dann
schnell oder einfach eine Schleife die vorne beginnt und dann alle ELemente
duchgeht ?

Die Seitenlängen der Dreiecke berechne ich auch. Habe die Punktkoordinaten
(XYZ) in einer Klasse gespeichert die genauso aufgebaut ist wie mein
c_Elemente. Da ich diese später im Programm auch
nochmal brauche wollte ich diese auch in die Klasse c_ELemente mit einbauen
damit ich quasi alles was zusammen gehört auch zusammen habe... ist das
sinnvoll oder wird dann beim sortieren das ganze sehr langsam da der ganze
Inhalt der Klasse "bewegt" werden muß ?

Quote:
Bis jetzt geh ich in einer Schleife einfach alles durch. Dies möchte ich
effizienter gestalten.

Wie kann ich die Klassen zB mit Quicksort sortieren und danach darin
effizient suchen ?

Wie bzw. wonach sortieren? Das ist die wichtige Frage. Stelle ein
solches Praedikat auf - das also zwei Elemente nimmt und Deiner Ordnung
entsprechend ein bool-Resultat zurueckgibt.

std::sort(vecDElemente.begin(), vecDElemente.end(), DeinPraedikat());

std::sort: Was für ein Sortieralgorithmus steckt dahinter ?

Quote:
sortiert dann den Vektor entsprechend.

Ali

Thx für Eure Hilfe

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Fri Nov 07, 2003 3:28 pm    Post subject: Re: Sortieren von Objekten in Vektor Reply with quote

"Albrecht Fritzsche" <alis-news (AT) gmx (DOT) net> schrieb:

Quote:
Sorry, irgendwo ist der Link verloren gegangen

www.artima.com/intv/goldilocks3.html

BTW: Stroustrup hat auf seiner Homepage eine sehr umfangreiche
FAQ zu C++, in der diese und andere Fragen beantwortet werden:

http://www.research.att.com/~bs/C++.html

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.