string zu CString
-
moin,
mein problem ist ganz ähnlich..zur ausgabe in meiner listbox benötige ich ein cstring zum aufruf einer funktion das ganze als char[].. ich werd noch beklopt..
nun muss ich die "textfelder" auch noch zerstückeln und vergleichen...
mit den string hab ich mal den befehl substr gesehen.. geht der bei csting auch?ich denke es ist das beste wenn ich da mit der klasse std::str also string mach..
wie wandel ich denn einen cstring in einen string um?
-
individuum schrieb:
...
nun muss ich die "textfelder" auch noch zerstückeln und vergleichen...
mit den string hab ich mal den befehl substr gesehen.. geht der bei csting auch?
...schau dir
str.Mid(...)
und
str.Find(...)
sowie
str.ReverseFind(...) an(str ist CString)
-
werd ich machen.. danke erstmal..
-
Neues Problem..
Ich habe eine instanz der klasse list..
in meiner instanz befinden sich structs..
struct Cache { string meldung; string tagnummer; Cache (string meldung_) : meldung(meldung_),tagnummer(meldung_.substr(0,2)) {} }; typedef list <struct Cache> cache; cache mycache;nun möchte ich das element löschen wenn die tagnummer schon vorhanden ist...
dazu hab ich den befehl
mycache.remove_if gefunden.. mir ist nun aber nicht klar wie ich da die tagnummer die sich ja in der structur und in der list befindet abfragen kann..string neu;
//die ersten beiden sind die tagnummer
mycache.remove_if(neu.substr(0,2).compare(hier der string aus dem struct))hat jemand ne idee wie ich da dann rankomm?
-
Abgesehen davon, daß deine Namenswahl katastrophal ist - an die Elemente der Struct kommst du über . (bei Zeigern über ->). Aber remove-if() erwartet sowieso eine Funktion, mit der es jedes Element testen kann, also ist es wohl am besten, so eine Funktion (bzw. Funktor) bereitzustellen.
-
sorry, wie sollte ich denn mein namenswahl gestalten?
hab nicht anders gelernt bislang...leider versteh ich nicht ganz was du meinst...
also soll remove-if ein funktion aufrufen wo jedes elmement durchlafen wird?!
meinst du vielleicht so?remove_if(Fktsearch(neu.substr(0,2)); bool Fktsreach(string vergleich) { for(it = mycache.begin();it!=mycache.end();it++) { if(it->meldung.compare(vergleich)); retrun true; } retrun false; }
-
individuum schrieb:
sorry, wie sollte ich denn mein namenswahl gestalten?
hab nicht anders gelernt bislang...Vor allem solltest du die Namen so wählen, daß sie sich nicht nur nach Groß- und Kleinschreibung unterscheiden (also entweder cache und cache_list oder cache_element und cache, aber die Variante Cache und cache ist einfach nur verwirrend)
also soll remove-if ein funktion aufrufen wo jedes elmement durchlafen wird?!
remove_if erwartet eine Funktion (oder etwas funktionsartiges), die ihm sagen kann, ob ein bestimmtes Listenelement gelöscht werden soll. Die ruft es dann für jedes Element der Liste auf. Du benötigst also so etwas:
bool has_tag(const Cache& data, const string& tag) { return data.tagnummer==tag; } ... mycache.remove_if(bind2nd(has_tag,neu.substr(0,2))); //bind2nd ist eine Hilfsfunktion der STL, mit der der zweite Parameter der Funktion festgesetzt wird(PS: Bei der bind2nd-Syntax bin ich mir nicht ganz sicher)
-
also erstmal vielen dank für deine hilfe!
CStoll schrieb:
remove_if erwartet eine Funktion (oder etwas funktionsartiges), die ihm sagen kann, ob ein bestimmtes Listenelement gelöscht werden soll. Die ruft es dann für jedes Element der Liste auf.
ok, also wenn die von remove_if aufgerufene Funktion true zurückgibt, wird das element gelöscht?!
das bind2nd benötige ich damit immer die aktuelle struktur übergeben wird? in dem beispiel das "const Cache& data"
wenn ich das so umsetzte wie du es gemacht hast kommt folgender fehler:
Fehler 6 error C3867: "CEmpfaengerDlg::Fkthas_tag": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&CEmpfaengerDlg::Fkthas_tag", um einen Zeiger auf den Member zu erstellen.das ihm die argumentenliste fehlt ist für mich nachvollziehbar..
aber wie übergeb ich ihm die?
-
bind2nd bekommt eine zweiwertige Funktion/Funktor und einen konstanten Wert und macht daraus einen einwertigen Funktor, der die übergebene Funktion mit dem aktuellen Parameter und dem an bind2nd übergebenen Wert aufruft - das dient dazu, für die Funktion has_tag() den zweiten Parameter festzulegen (als ersten Parameter übergibt remove_if() nacheinander alle Listen-Elemente). Aber das geht direkt nur mit globalen Funktionen (und eventuell statischen Klassenmembern).
Wenn du die Vergleichsfunktion als normalen Member der Cache-Klasse definiert hast, brauchst du einen weiteren STL-Funktor namens mem_fun():
bool Cache::has_tag(const string& the_tag) { return this->tagnummer == the_tag; } ... mychache.remove_if(bind2nd(mem_fun(&Cache::has_tag),neu.substr(0,2))); //mem_fun wandelt f(x,y) um in x.f(y) //bind2nd wandelt f(x) um in f(x,wert)
-
Overload!
Viel zu hoch für mcih
Cache war doch bislang ein "struct" und keine klasse..
das zu ändern hab ich versucht, aber bei den fehlern schnell wiede rrückgänig gemacht.Ich bin auch überzeugt das es da ne einfachere lösung gibt...
ich bekomm einen string (45 zeichen lang)
wenn an stelle 42 ein + steht wird er der list hinzugefüht
wenn eine # da steht, wird der text, falls vorhanden gelöscht!ich dachte remove_if wäre da die schöne lösung.. aber das artet ja extrem aus..
fällt da jemanden ein anderer lösungweg ein?
-
ja, remove_if() ist eine Lösung - wenn du weißt, wie du es einsetzen mußt ;).
Als Alternative könntest du noch die Liste von Hand durchlaufen und selber alle Elemente löschen:
string tag = neu.substr(0,2); for(list<Cache>::iterator pos=mycache.begin();pos!=mycache.end();) { if(pos->tagnummer==tag) pos=mycache.erase(pos); else ++pos; }(falls du Angst vor Performance-Einbußen hast - remove_if() macht intern genau das selbe)
-
die lösung ist doch 23 mal einfacher

Besten danke für deine Hilfe..
wie lange programmierst du eigentlich schon?
du machst das auch beruflich oder?
-
individuum schrieb:
die lösung ist doch 23 mal einfacher

Ach, das sieht nur so aus
Wenn du weißt, wie es geht, kannst du mit den STL-Funktoren einiges auf die Beine stellen.wie lange programmierst du eigentlich schon?
Weiß nicht mehr genau, aber ist schon eine ganze Weile (angefangen bei C64 Basic, während der Schule dann TP und schließlich C(++)
du machst das auch beruflich oder?
Noch nicht, aber ich hab's vor.
-
Das forum würd ich als referenz angeben
