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 😉


Anmelden zum Antworten