explode
-
jo ich bin ein phphler und lerne darüber jetzt c/c++.
kumpels belächelten das, da man normal andersrum draufkommt und einfacher sein soll. aber nungut, es ist wie es ist :pin php arbeitete ich mit befehlen die mir jetzt in c/c++ total fehlen und das leben echt schwer machen.
zum einen das explode
jemand hier: http://www.c-plusplus.net/forum/viewtopic.php?p=408696#408696 hat wohl selbes problem gehabt.ich habe mal den code den er postete genommen und compiliert.
map <int,string> explode( const string& separator, const string& data ) { map <int,string> values; if (separator.empty() || data.empty()) return values; int counter = 0; while (true) { std::string::size_type pos; pos = data.find(seperator, 0); if (pos == std::string::npos) { values[counter++] = data; break; } values[counter++] = data.substr(0, (pos - 1)); data = data.substr((pos + seperator.length()-1)); } return values; }
ich fand auch seinen fehler. oben im funktionskopf steht separator (mit a) und unten im funktionskörper seperator (mit e)
und noch das "const" bei ", const string& data ) " entfernt und er compilierte fehlerfrei.dann wollt ichs mal testen und darstellen:
map <int,string> explode( const string& separator, string& data )
{
map <int,string> values;if (separator.empty() || data.empty())
return values;
int counter = 0;
while (true)
{
std::string::size_type pos;
pos = data.find(separator, 0);
if (pos == std::string::npos)
{
values[counter++] = data;
break;
}
values[counter++] = data.substr(0, (pos - 1));
data = data.substr((pos + separator.length()-1));
}
return values;
}int main(int argc, char* argv[])
{
string text="aaa;;123:bla;haha";
map <int,string> arrays;arrays = explode(";",text);
for(map <int,string>::iterator i=arrays.begin();i!=arrays.end();i++)
{
cout << i->first << endl;
}system("pause");
return 0;
}0 error, aber er hängt in endlosschleife. kann wer bitte das problem finden und berichtigen?
-
Hallo,
ich kann jetzt gar nicht mal soviel zu deiner Lösung sagen, aber ich würde empfehlen (wie immer
) stringstreams zu benutzen:
#include <iostream> #include <vector> #include <sstream> using namespace std; void explode(stringstream& tmp, vector<string>& vec, char sep) { string tmpStr; while(getline (tmp, tmpStr, sep)) vec.push_back(tmpStr); } int main() { stringstream toExplode; vector<string> exploded; toExplode << "trenn:mich:beim:doppelpunkt" << endl; char sep = ':'; explode(toExplode, exploded, sep); // Ausgabe vector<string>::iterator it = exploded.begin(); while(it != exploded.end()){ cout << *it << endl; it++; } }
Ich find das so zumindest einfacher, wobei man das wahrscheinlich noch einfacher hinbekommt. Vielleicht gibt dir das zumindest neue Anregungen.
[EDIT] Mist Rechtschreibung....
-
perfekt! danke schön!
mit <sstream> noch nie gearbeitet. finde per google leider nicht deutsche info was jetzt an sstream so besser sein soll ausser das es scheinbar einfacher zahlen <-> string konvertieren kann. aber das brauch wir ja hier nicht. kannst du eventuell wenn lust erklären warum du sstream nutzt?
und warum erstellst du einen iterator?// Ausgabe vector<string>::iterator it = exploded.begin(); while(it != exploded.end()){ cout << *it << endl; it++; }
man könnte doch auch einfach per size_type size(); und cout << exploded[i] << endl; durch den vector gehen. ich frag nur um zu lernen
-
Hallo,
in diesem Fall bieten sich stringstreams an, weil du damit strings eben wie streams behandeln kannst. D. h., es ist mögich, getline zu nutzen, und das macht die Syntax einfacher. Allerdings gibt es auch noch andere Möglichkeiten, strings entsprechend aufzuteilen:
http://www.boost.org/libs/tokenizer/tokenizer.htmDas mit dem Iterator mach ich halt so, aber man kann es natürlich auch so machen, wie du geschrieben hast. Man gewöhnt sich halt manche Dinge an.
-
@CarstenJ: du scheints ahnung zu haben.
eventuell kannst hierbei helfen.map<string, shared_ptr<Basic_class> > m_modul; m_modul["Klasse1"].reset(new Klasse1()); m_modul["Klasse1"]->Show();
soweit gehts! jetzt habe ich vieele dieser Klassen und dachte an eine schleife welche ich mittels iteratoren durchlaufe und darstelle.
eben so wie du es aufzeigtest.map<string, shared_ptr<Basic_class> >::iterator it = m_modul.begin(); while(it != m_modul.end()) { *it->Show(); it++; }
keine compilerfehler, aber error C2039: 'Show' : Ist kein Element von 'pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class boost::shared_ptr<class Basic_class> >'
kannst mir eventuell sagen wo mein fehler liegt?
-
-
*x->y ist *(x->y), nicht (*x)->y. Wenn du letzteres willst, musst du's auch so schreiben - geht hier aber eh nicht, denn:
-
map<>::value_type (das, worauf ein map<>::iterator zeigt) ist ein Paar aus Schlüssel und zugehörigem Wert. iter->first ist der Schlüssel, iter->second der Wert. Du brauchst also: iter->second->Show().
-
-
das peil ich nicht ganz
map<string, shared_ptr<Basic_class> >::iterator it = m_modul.begin(); while(it != m_modul.end()) { *(it->Show()); // gleicher fehler it++; }
anderer versuch
map<string, shared_ptr<Basic_class> >::iterator pos = m_modul.begin(); for (pos=m_modul.begin(); pos!=m_modul.end(); pos++) { pos->Show(); // auch der fehler }
eventuell hast du die lösung operator void nur ich bin zu doof sie zu verstehen. kannst bitte bissle genauer sagen?
-
Ich hab gerade gemerkt, dass ich Problem #2 übersehen hatte. Siehe editiertes Posting.
-
Hallo,
ich denke, dass liegt eher daran, dass eine Map zwei Werte hat:
... (*it)->second->Show(); ...
-
argh! stimmt! daran dachte ich garnicht
das die Lösung
(*it->second).OnShow();
DANNNKKKKEEEEEE!
*ich wusste ihr schafft das