 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Marten Weber Guest
|
Posted: Thu Nov 06, 2003 4:15 pm Post subject: Sortieren von Objekten in Vektor |
|
|
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
|
Posted: Thu Nov 06, 2003 9:23 pm Post subject: Re: Sortieren von Objekten in Vektor |
|
|
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
|
Posted: Fri Nov 07, 2003 9:02 am Post subject: Re: Sortieren von Objekten in Vektor |
|
|
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
|
Posted: Fri Nov 07, 2003 9:21 am Post subject: Re: Sortieren von Objekten in Vektor |
|
|
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
|
Posted: Fri Nov 07, 2003 12:21 pm Post subject: Re: Sortieren von Objekten in Vektor |
|
|
| 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
|
Posted: Fri Nov 07, 2003 3:28 pm Post subject: Re: Sortieren von Objekten in Vektor |
|
|
"Albrecht Fritzsche" <alis-news (AT) gmx (DOT) net> schrieb:
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 |
|
 |
|
|
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
|
|