Nach Werten in einer Vektortabelle suchen

fujitsufan

Erfahrenes Mitglied
Hallo,

wie kann ich in einer Vektortabelle nach Einträgen suchen.
Bei Vektortabellen vom Typ "string" ist dies ja noch easy.

Code:
vector <string> vList;
vList.pusch_back("Eintrag1")
vList.pusch_back("Eintrag2")
vList.pusch_back("Eintrag3")

if(find(vList.begin(), vList.end(), "Eintrag2") != vList.end())
{
     //Eintrag gefunden
}

Wie stelle ich dies an wenn eine Vektortabelle folgenden Typs ist?
Code:
typedef struct tAttrCtrl
{
	char cSelText[42];
	char cAttrNo[8];

}tAttrCtrl;

vector <tAttrCtrl> vMerker;
tAttrCtrl sAttrCtrl;

vMerker.clear();

strcpy(sAttrCtrl.cAttrNo, "100");
strcpy(sAttrCtrl.cSelText, "Eintrag1");
vMerker.push_back(sAttrCtrl);

strcpy(sAttrCtrl.cAttrNo, "200");
strcpy(sAttrCtrl.cSelText, "Eintrag2");
vMerker.push_back(sAttrCtrl);

strcpy(sAttrCtrl.cAttrNo, "300");
strcpy(sAttrCtrl.cSelText, "Eintrag3");
vMerker.push_back(sAttrCtrl);

Ich möchte nach dem Eintrag ->cSelText = "Eintrag3" suchen damit ich den Wert "300" zur Verfügung habe.

Code:
find(vMerker.begin(), vMerker.end(), ?)
{
      //Eintrag gefunden
}

Da wo sich das ? befindet müsste doch eine Binärfunktion hinterlegt werden.
Ich wende solch eine Binäfunktion auch bei der Funktion "sort( , , ); an

Beispiel:
Code:
typedef struct tElemSubIniSek
{
	vector <int> vElemNr;
	char cSubIniType[8];
	char ElementSubIniSektion[128];
	char ControlText[41];
	vector <tElemPos> vElemPos;

}tElemSubIniSek;

vector <tElemSubIniSek> vElementSubIniSektion;

struct GreaterY2IniSekPos : public std::binary_function<tElemSubIniSek, tElemSubIniSek, bool> 
{ 
   bool operator()( const tElemSubIniSek &s1, const tElemSubIniSek &s2 ) const 
   { 
	   return s1.vElemPos[0].dPosY > s2.vElemPos[0].dPosY; 
   } 
};

sort(vElementSubIniSektion.begin(), vElementSubIniSektion.end(), GreaterY2IniSekPos());


Kann wir jemend bei der Funktion "find( , , ); weiterhelfen.
Eine for Schleife geht auch, weiß ich.
Bläht aber meine Code unschön auf.

Vielen Dank!
fujitsufan
 
Hallo,
ich vermute mit der Funktion find() wirst du hier nicht weiterkommen, da der Typ von deinem Vergleichswert dem der zugehörigen Iteratoren entsprechen muss.
Das mit dem aufblähen des Codes verstehe ich allerdings nicht wirklich. Es wären quasi 2 Zeilen mehr mittels while()/for(). Alternativ könntest du auch in der if eine Funktion wie find() nutzen, die du dir selbst schreibst (bzw musst). Weil du brauchst definitiv eine Vergleichsfunktion für deinen Datentyp.

Grüße,
Jennesta
 
Hallo Jennesta,
das mit der eigenen Funktion "find()" hatte ich mir schon gedacht.
Es hätte ja sein können, es gäbe etwas Fertiges, was man auch nutzen kann.

Trotzdem vielen Dank!
fujitsufan
 
Hallo Jennesta,
kannst Du mir auch erklären wie ich über den Iterator "itElem" an die Inhalte "PosX,PosY" einer Vektortabelle rankomme.
Der Vektor ist vom Typ "TElement" .

Folgende Struktur:

Header:
class TElement : public BaseElement
{
public:
double PosX,PosY,Breite,Hoehe;
}

typedef vector < TElement*> TVElement;
TVElement vChildVonElement;

Cpp:
TVElement::iterator itElem;

for(itElem=vChildVonElement.begin(); itElem<vChildVonElement.end(); itElem++)
{
itElem->****? ----->Hier erschein keine Variable (PosX,PosY).
}


Vielen Dank!

fujitsufan
 
Hallo Jennesta,

vielen Dank, ich hab´s grade auch bemerkt.
Habe das Sternchen in der Typdefinition total übersehen.
"typedef vector < TElement*> TVElement;"

Viele Grüße
fujitsufan
 
Zurück