Ein Wert in einem Arry oder einem Strukt suchen
-
Hallo,
die Überschrift ist auch meine Frage. Ich möchte in einem Arry oder einem Strukt nach einem AnsiString suchen. Sobald das Programm diesen gefunden hat, soll es die Indexnummer des Arrays oder des Struckts wiedergeben.
Habt ihr dafür eine Lösung parat?
-
Du nimmst eine Schleife und lässt sie bis zu der oberen Grenze des Arrays laufen. Bei jedem Schleifendurchgang überprüfst du auf ein Vorkommen des Strings. Wenn dem so ist, gibst du die Schleifenvariable, die du am Beginn mit 0 initialisiert hast, zurück.
-
Was hast du denn für ein Array/Struct? Etwas mehr Details wären schon hilfreich.
In einem Array von AnsiString's ("AnsiString arr[...];" kannst du z.B. mit einer Schleife alle Werte durchgehen und mit dem Suchtext vergleichen. Oder du verwendest std::find(), das macht das automatisch.
In einem struct müsstest du einzeln alle (wichtigen) Member mit dem Suchstring vergleichen.
-
Erstmal danke für die schnellen Posts.
Mein Array ist Zweidimensional. In der ersten "Dimension" steht eine Identifikationsnummer. In der zweiten "Dimension" steht ein dazugehöriger AnsiString. Wenn ich also die Indexnummer von der Identifikationsnummer(nach der Suche) herausfinde, dann kann ich diese Indexnummer verwenden um auf den dazugehörigen Ansistring zu zugreifen.
Gibt es dafür eine Quelltextlösung?
Hätte es sonst zwar auch gerne über einen Vektor gelöst, aber bin noch sehr neu in der C++ Geschichte unterwegs.
-
Ich bevorzuge ja den Algorithmen-Ansatz:
struct data { int id; string text; } bool gleich(const data& item,const string& text) { return item.text == text; } ... vector<data> Daten; ... vector<data>::iterator pos = find_if(Daten.begin(),Daten.end(),bind2nd(gleich,"Echo")); if(pos!=Daten.end()) cout<<"Gefunden mit Index"<<pos->id<<endl;Anstelle des find_if()-Aufrufs kannst du auch in einer for()-Schleife über deine Daten rennen und jeweils pos->text mit dem Suchstring vergleichen.
-
Hi,
vielleicht ist ja auch eine std::map was für Dich ? Da kannst Du (nahezu) Beliebiges als Zugriffschlüssel definieren und direkt zugreifen. Macht von der Performance her vermutlich nichts aus gegenüber CStolls Lösung, ist aber manchmal von Handling her einfacher.
Gruß,
Simon2.
-
Hey,
wollte es lieber mit find_if lösen. Leider komme ich mit deiner (CStoll) Lösung nicht ganz klar. Hier ist erstmal mein bisheriger Quelltext:std::vector<AnsiString> ParaNum; std::vector<AnsiString> ParaName; _di_IXMLDocument XML = LoadXMLDocument("dynamictext_fsc.xml"); _di_IXMLNodeList NodeList = XML->DocumentElement->ChildNodes; int count = NodeList->Count; for (int i=0; i<count; i++) { _di_IXMLNode ValueNode = NodeList->Nodes[i]; ParaNum.push_back((AnsiString)ValueNode->GetAttribute("id")); PraName.push_back(ValueNode->ChildNodes->FindNode(Language)->NodeValue); }Nun soll in dem Vectro 'ParaNum' die Indexnummer des Elements zu einem passenden AnsiString Objekt gefunden werden.
Anschliessend möchte ich diese Indexnummer in einer int-Variable ablegen, um damit auf das Element an der Gleichen Stelle von dem Vector ParaName zuzugreifen.Bitte gebt mir eine Hilfestellung. Sicherlich ist die for-Schleife auch eine Lösung, dennoch ist es keine optimale Programmierung.
-
Achso, du verwendest reine Strings in deinem vector<> - da reicht auch find():
vector<AnsiString>::iterator pos = find(ParaNum.begin(),ParaNum.end(),suchstring); int index = pos - ParaNum.begin(); ParaName[index] = ...;Aber eine bessere Lösung wäre es vermutlich, du verpackst beide Strings in eine Struct und verwaltest sie dann gemeinsam.