STL: vector mit vector vergleichen
-
Hallo
ich wuerde gerne zwei vectoren miteinander vergleichen. Der eine enthaelt Punkt-Objekte, der andere Indizes. Jetzt wuerde ich gerne alle Punkte, die an den jeweiligen Indizes stehen, rausholen und in einem neuen vector speichern. Bis jetzt habe ich das so gemacht:
vector<PointN> getIndexPoints(vector<PointN>& vPoints, vector<int>& vInds) { vector<PointN> vClusterPoints; for(unsigned int j = 0; j < vInds.size(); j++) { for(unsigned int i = 0; i < vPoints.size(); i++) { int ind = vInds[j]; if(i == ind) { PointN store = vPoints[i]; vClusterPoints.push_back(store); } } } return vClusterPoints; }Das ist allerdings extrem langsam fuer viele Punkte und ich wollte mal wissen ob das besser geht.
-
Da du in sowieso nur einmal pro Durchlauf der inneren Schleife die if-Bedingung erfüllst, kannst du die Schleife eigentlich auch weglassen:
for(int i=0;i<vInds.size();++i) if(vInds[i]<vPoints.size()) vCluster.push_back(vPoints[vInds[i]]);
-
Hmmmm, wenn ich das richtig sehe, brauchst du doch die innere Schleife gar nicht. Du verwendest vInds[j] (indirekt) für den Zugriff auf vPoints. Also müsste das hier genauso gehen:
vector<PointN> getIndexPoints(vector<PointN>& vPoints, vector<int>& vInds) { vector<PointN> vClusterPoints; size_t pointsSize = vPoints.size(); size_t intsSize = vInds.size() for(unsigned int j = 0; j < intsSize; j++) { int ind = vInds[j]; if(ind < pointsSize) vClusterPoints.push_back(vPoints[ind]); } return vClusterPoints; }...oder irre ich mich?
Übrigens: Die beiden Parameter der Funktion sollten const sein.Stefan.
-
Evtl. ist es sinnvoll, auf vClusterPoints vorher ein reserve() zu machen, jenachdem wieviel Punkte man für den ClusterPoints-Vektor erwartet. So erspart man sich die eher kostspieligen Neu-Allokierungen am Anfang.
-
Danke fuer die Tipps. Aber ich verstehe nicht wie ich ueber Vergleich des Index mit der Groesse des Vectors
if(Inds[i] < vPoints.size())auf den Index komme? Kann mir das jemand erklaeren?
-
Äh, ich dachte Inds[i] IST der Index...
Für alles andere würde nichts des hier geschriebenen Sinn machen

int ind = vInds[j]; // Hole jtes Element von vInds if(ind < pointsSize) vClusterPoints.push_back(vPoints[ind]); // Benutze es als Index
-
Aehm, ich glaub ich habs verstanden, da stand mir einer doch tatsaechlich auf der Leitung
. Danke euch fuer die Hilfe!!!
-
Samo schrieb:
Danke fuer die Tipps. Aber ich verstehe nicht wie ich ueber Vergleich des Index mit der Groesse des Vectors
if(Inds[i] < vPoints.size())auf den Index komme?
Das ist nur eine Sicherheitsabfrage, ob der Index im "erlaubten" Bereich liegt - kannst du auch weglassen, wenn du das nicht brauchst.
Ansonsten steht doch der Index in vInd[i] drin, oder habe ich dich irgendwo falsch verstanden?
-
Ansonsten steht doch der Index in vInd[i] drin, oder habe ich dich irgendwo falsch verstanden?
Jaja, alles korrekt
wie gesagt, mir stand da jemand gewaltig auf der Leitung.Danke nochmal und entschuldigung fuer das Verwirrung stiften
