suche in vector
-
Was gibt der User ein? int oder double zahlen?
naja du kannst es so machen.
1. du nimmst die zahl und vergleichst mit allen zahlen aus deinem vector
2. du merkst dir die differenz
3. beim nächsten schritt 1. überprüfst du ob die differenz jetzt grösser oder kleiner war. wenn es also passender war dann, ist der gesuchte index dein neuer indexSprich:
schleife von 0 bis vector-ende
dann bei jedem index, vergleich mit der usereingabe
( beim erstenmal wert merken, d.h. index 0 )
ab dann immer die neue differenz zur gesuchten zahl, mit dem gemerktenwert vergleichen ( If bedingung ) und je nachdem neu merken oder wenn dif grösser, dann nicht.Das wars eigentlich schon.
-
Wenn du wirklich direkt suchen willst, versuchs stattdessen vielleicht mal mit std::map statt std::vector. Da funktioniert das ganz gut.
-
Einfach sortierte Liste, bzw Binärbaum nehmen, einsortieren und mit linkem bzw. rechten Nachbarn vergleichen.
-
BloodLord schrieb:
Wenn du wirklich direkt suchen willst, versuchs stattdessen vielleicht mal mit std::map statt std::vector. Da funktioniert das ganz gut.
aber nur bei gleichen werten, und bei floating points auch nicht sehr sicher.
-
otze schrieb:
BloodLord schrieb:
Wenn du wirklich direkt suchen willst, versuchs stattdessen vielleicht mal mit std::map statt std::vector. Da funktioniert das ganz gut.
aber nur bei gleichen werten, ... .
Was meinst du damit genau?
-
sortier mit predikat
class pred: public binary_function<double,double,bool> { public: pred(const double &Init):v(Init){} bool operator()(const double &a,const double &b) const { return fabs(v-a)<fabs(v-b); } private: double v; }; int main(int argc, char* argv[]) { std::vector<double> v; v.push_back(-2.02); v.push_back(2.02); v.push_back(6.542); v.push_back(10.256); v.push_back(-8.95); v.push_back(0.02); sort(v.begin(),v.end(),pred(2)); size_t i; for(i=0;i<v.size();++i) cout<<v[i]<<"\n"; }
-
nein, tut mir leid, aber das hilft mir nicht!
die reihenfolge der werte darf auf keinen fall veraendert werden!!!!
ich dachte nur ,dass es sowas wie find fuer nene vector gibt, nur dass der halt nicht nach == sucht, sondern nach der kleinste differenz zwischen nem vectorwert und ner eingabe.
ich glaube das muesste irgendwie mit dem predikat gehen, aber ich weiss halt nicht genau wie!
find_if() scheint auch das zu tun was ess soll... na ja nur das raichtige predikat fehlt mir halt noch! und dann vielleicht noch ein weg, wie ich aus dem iterator den mit find_if zurueck gibt wieder den index erhalte, also das wievielte element das im vector ist!
thx!!
-
wie schon gesagt, würde ich sowas selber schreiben...
ist ja nicht so schwer...du durchläufst den vektor bis zum ende... es gibt eine variable diff und eine variable index = 0... bei jedem vektorelement ermittelst du nun die differenz zu dem gesuchten wert... wenn der ermittelte wert kleiner ist, als die variable diff, dann speicherst du die neue differenz in der variablen diff und setzt den index... wenn der gesamte vektor durchlaufen wurde, dann gibts du den index zurück...
(so würde ich das machen... vielleicht gibt es ja noch was besseres und effizienteres)
P.S.: Die Reihenfolge der einträge darf nicht verändert werden? Ansonsten könnte man das ja mit dem "Divide & Conquer" Prinzip machen... das wäre effektiver...
-
Hallo,
std::min_element kann helfen:struct diff{ diff(double val) : val_(val) {} bool operator()(double x, double y) const { return getDelta(x) < getDelta(y); } private: double getDelta(double x) const { if (x < 0 && val_ > 0 || x > 0 && val_ < 0) { return fabs(x) + fabs(val_); } return fabs(x - val_); } double val_; }; int main() { vector<double> v; ... vector<double>::iterator it = min_element(v.begin(), v.end(), diff(benutzerEingabe)); cout << "Wert: " << *it << " Pos: " << distance(v.begin(), it) << endl; }
Die Berechnung des Abstands geht sicher eleganter. Der mathematische Teil meines Hirns ist aber gerade nicht aktiv.
-
double getDelta(double x) const { return fabs(x - val_); }
Reicht.
-
MFK schrieb:
double getDelta(double x) const { return fabs(x - val_); }
Reicht.
Das hatte ich intuitiv hingeschrieben. Als ich dann meinen "Hast du an die Spezialfälle gedacht"-Check angeworfen und dabei mein Gehirn in den Aktiv-Modus geschaltet habe, ist mal wieder nur Müll rausgekommen. Was Paranoia so alles bewirken kann
Und zu allem Überfluss sehe ich gerade, dass b7f7 die Lösung ja eigentlich schon gepostet hatte.