// Literatur: Vorlesungsunterlagen SEN (FH Hagenberg, HSSE Semester 2) // C++ Referenz (http://www.cplusplus.com) // Strings #include <string> string s("test"); s.size(); s.clear(); bool isEmpty = s.empty(); s[0] = 'f'; s.at(0) = 'f'; s += "next"; s += str2; s += 'c'; s.append(str2); s.append(str2, 2, 3); // ab Zeichen 2, 3 Zeichen lang s.append("asdf"); s.append("asdfasdf", 4); // 4 Zeichen vom String s.append(10,'.'); // 10 x '.' s.append(firstIter, secondIter); s.push_back('c'); s.assign(str2); s.assign(str2, 2, 3); // ab Zeichen 2, 3 Zeichen lang s.assign("asdf"); s.assign("asdfasdf", ); // 4 Zeichen vom String s.assign(10, '.'); // 10 x '.' s.assign(firstIter, secondIter); s.insert(2, str2); // String an Position 2 einfügen s.insert(2, str2, 3, 4); // String an Position 2 einfügen, // ab Zeichen 3, 4 Zeichen lang s.insert(2, "asdf"); // String an Position 2 einfügen s.insert(2, "asdfasdf", 4); // String an Position 2 einfügen, // 4 Zeichen vom String s.insert(2, 10, '.'); // an Position 2, 10 x '.' einfügen s.insert(iter, '.'); s.insert(iter, 10, '.'); s.insert (iter, str2.begin(), str2.end); s.erase(iter); s.erase(firstIter, secondIter); s.replace(2, 3, str2); // String an Position 2, // 3 Zeichen lang ersetzen mit str2 s.replace(2, 3, str2, 4, 5); // String an Position 2, // 3 Zeichen lang ersetzen mit str2 // (ab Position 4, 5 Zeichen lang) s.replace(2, 3, "asdf"); // String an Position 2, // 3 Zeichen lang ersetzen mit String s.replace(2, 3, "asdfasdf", 4); // String an Position 2, // 3 Zeichen lang ersetzen mit str2 // (4 Zeichen vom String) s.replace(2, 3, 10, '.'); // String an Position 2, // 3 Zeichen lang ersetzen mit 10 x '.' s.replace(firstIter, secondIter, str2); s.replace(firstIter, secondIter, "asdf"); s.replace(firstIter, secondIter, "asdfasdf", 4); s.replace(firstIter, secondIter, 10, '.'); s.replace(firstIter, secondIter, str2.begin(), str2.end()); s.copy(charArr, 2, 3); // String ab Position 2, // 3 Zeichen lang in charArr kopieren s.swap(str2); s.c_str(); size_t position = s.find(str2); if (position != string::npos) ... s.find(str2, 2); // Suche ab Position 2 s.find("asdf"); s.find("asdf", 2); // Suche ab Position 2 s.find("asdf", 2, 3); // Suche ab Position 2, 3 Zeichen lang s.find('a'); s.find('a', 2); // Suche ab Position 2 s.rfind(...); // von hinten Suchen string s("alle Selbstlaute durch Punkt ersetzen"); size_t position; position = s.find_first_of("aeiou"); while (position != string::npos) { s[position] = '.'; position = s.find_first_of("aeiou", position + 1); } // s = ".ll. S.lbstl..t. d.rch P.nkt .rs.tz.n." s.find_last_of(...); s.find_first_not_of(...); s.find_last_not_of(...); str2 = s.substr(); // str2 == s str2 = s.substr(2); // von Position 2 bis zum Ende str2 = s.substr(2, 3); // von Position 2, 3 Zeichen lang s.compare(str2) == 0 // Strings gleich s.compare("asdf") s.compare(2, 3, str2) // s ab Position 2, // 3 Zeichen lang vergleichen s.compare(2, 3, str2, 4, 5) // s ab Position 2, // 3 Zeichen lang mit str2 ab Position 4, // 5 Zeichen lang vergleichen s.compare(2, 3, "asdf") // s ab Position 2, // 3 Zeichen lang vergleichen s.compare(2, 3, "asdf", 4) // s ab Position 2, 3 Zeichen lang mit // ".." 4 Zeichen lang vergleichen // Streams #include <iostream> cout << "text" << var << endl; // standard Ausgabe cin >> intVal; // standard Eingabe #include <fstream> ofstream out("file.txt"); out << "text"; out.close(); .is_open() .put(char c) .write(const char* c, streamsize maxc) .flush .eof() .fail() ifstream in("file.txt"); in >> intVal; in.close(); .is_open() .get(char &c) .getline(char *c, streamsize maxc) .read(char *c, streamsize maxc) .eof() .fail() // String Streams #include <sstream> ostringstream oss; oss << "text"; oss.str(); istringstream iss(string); iss >> intVal; // Stream-Manipulatoren hex // Hexadezimalausgabe (bis auf Widerruf) oct // Oktalausgabe dec // Dezimalausgabe scientific // Exponenten Darstellung fixed // normale Darstellung setprecision(4) // Nachkommastellen für nächste Ausgabe setw(3) // Weite der Zahl setfill('0') // Füllzeichen setzen left // Ausrichtung right upercase // Großschreibung nouppercase boolalpha // Ausgabe von true/false noboolalpha ostream &hr (ostream &os) // eigener Manipulator { os << endl; os << "-------------"; os << endl; return os; } // Container // Queue - FIFO Datenstruktur queue<int> q; q.push(1); // fügt Element am Ende ein ivalue = q.front(); // liefert Element am Anfang q.pop(); // löscht Element am Anfang // Stack - LIFO Datenstruktur stack<int> s; s.push(1); // fügt Element oben ein ivalue = s.top(); // liefert oberstes Element s.pop(); // löscht oberstes Element // Vektor - automatisch wachsendes Array // + schnelles Einfügen/Löschen am Ende // + Direktzugriff mit Indexoperator #include <vector> vector<int> v; v.push_back(0); // fügt Element am Ende ein v[0] // Zugriff auf Element an Stelle 0 v.erase(iter); // Element löschen v.erase(v.begin(), iter); // Bereich löschen v.empty() // Überprüfung ob leer v.size() // Ausgabe der Größe v.pop_back(); // Element am Ende löschen v.clear(); // Container löschen // Liste - doppelt verkettete Liste // + schnelles Einfügen/Löschen an jeder Position // - nur sequentiellen Zugriff (beide Richtungen) #include <list> list<int> l; l.insert(iter, 0); // Einfügen eines Elements an // bestimmten Iterator-Position l.push_front(0); // fügt Element am Anfang ein l.push_back(0); // fügt Element am Ende ein l.pop_front(); // Element am Anfang löschen l.pop_back(); // Element am Ende löschen l.front(); // liefert Element vom Anfang l.back(); // liefert Element vom Ende l.sort(); // Elemente sortieren l.reverse(); // Ordnung der Elemente vertauschen l.clear(); // Container löschen l.removeif(prädikat); // Löscht Elemente, // welche Bedingung erfüllen l.remove(0); // Löscht alle Elemente mit gleichen Wert // Map - assoziativer Container mit Schlüssel/Werte Paar // (eindeutige Schlüssel) // + Einfügen und Suchen von Schlüsseln in logarithmischer Zeit // + Löschen von Schlüsseln in konstanter Zeit // + aufsteigend geordnet nach Schlüssel #include <map> map<string, int> m; m.insert(pair<string, int>("test", 100)); pair<map<string, int>::iterator, bool> ret; ret = m.insert(pair<string, int>("test", 100)); if (ret.second == false) { cout << "Element existiert bereits: " << ret.first->second << endl; } m.erase(iter); m.erase("test"); m.erase(firstIter, secondIter); m.clear(); m.find("test")->second; m.count("test"); m.size(); m.empty(); m["test2"] = 50; // Set - assoziativer Container mit Schlüsseln (eindeutige Schlüssel) // + Einfügen und Suchen von Schlüsseln in logarithmischer Zeit // + Löschen von Schlüsseln in konstanter Zeit // + aufsteigend geordnet nach Schlüssel #include <set> set<string> s; s.insert("test"); s.erase(iter); s.erase("test"); s.erase(firstIter, secondIter); s.clear(); iter = s.find("test"); s.count("test"); s.size(); s.empty(); // Bitset #include<bitset> bitset<4> b; b.set(); // alle Bits setzen b.set(2); // Bit an Position 2 setzen b.set(2, true); // Bit an Position 2 setzen b.set(2, false); // Bit an Position 2 löschen b.reset(); // alle Bits löschen b.reset(2); // Bit an Position 2 löschen b.flip(); // alle Bits negieren b.flip(2); // Bit an Position 2 negieren int size = b.size(); // Anzahl der Bits int cnt = b.count(); // Anzahl an gesetzten Bits bool erg = b.any(); // true, wenn irgend ein Bit gesetzt bool erg = b.none(); // true, wenn kein Bit gesetzt bool erg = b.test(2); // true, wenn Bit an Position 2 gesetzt dequeue // ... double ended queue // + schnelles Einfügen/Löschen am Anfang und am Ende slist // ... einfach verkettete Liste // + benötigt weniger Speicher // - Durchlauf nur in eine Richtung multimap // ... Schlüssel/Werte Paare // (mehrfache Verwendung von Schlüssel erlaubt) multiset // ... Schlüssel (mehrfache Verwendung von Schlüssel erlaubt) // Iteratoren vector<int>::iterator iter = vec.begin(); vector<int>::const_iterator citer = vec.end(); vector<int>::reverse_iterator riter = vec.rbegin(); vector<int>::reverse_const_iterator rciter = vec.rend(); back_inserter(Container) forward_inserter(Container) inserter(Container, Container.end()) distance(firstIter, secondIter) // Abstand der Iteratoren advance(Iter, distance) // Iterator weiter setzen // Stream Iteratoren istream_iterator<int> in(cin); istream_iterator<int> eos; copy(in, eos, back_inserter(vec)); ostream_iterator<int> out(cout, " "); copy(vec.begin(), vec.end(), out); // Prädikate bool Pred(int x, int y) // true ... Aktion wird ausgeführt { // false ... Aktion wird nicht ausgeführt return x > y; } bool Pred(int x) { return x >= 0; } plus<> minus<> multiplies<> divides<> modulus<> negate<> logical_and<> logical_not<> logical_or<> equal_to<> not_equal_to<> greater<> greater_equal<> less<> less_equal<> // Algorithmen #include <algorithm> fill(v.begin(), v.end(), 0); fill_n(v.begin(), 3, 0); fill_n(back_inserter(v), 10, 0); generate(v.begin(), v.end(), Func); generate(v.begin(), 3, Func); copy(c1.begin(), c1.end(), back_inserter(c2)); copy(c1.begin(), c1.end(), ostream_iterator<int>(cout, " ")); copy_backward(c1.begin(), c1.end(), ...); iter = find(v.begin(), v.end(), 5); iter = find_if(v.begin(), v.end(), Pred); count(v.begin(), v.end(), Elem); count_if(v.begin(), v.end(), Pred); for_each(v.begin(), v.end(), Func); bool vorhanden = binary_search(v.begin(), v.end(), 5); bool gleich = equal(v.begin(), v.end(), v2.begin()); bool gleich = equal(v.begin(), v.end(), v2.begin(), Pred); bool kleiner = lexicographical_compare(v.begin(), v.end(), v2.begin(), v2.end()); bool kleiner = lexicographical_compare(v.begin(), v.end(), v2.begin(), v2.end(), Pred); elemC = max(elemA, elemB); elemC = max(elemA, elemB, Pred); iterC = max_element(v.begin(), v.end()); iterC = max_element(v.begin(), v.end(), Pred); min min_element transform(v.begin(), v.end(), v.begin(), negate<int>()); transform(str.begin(), str.end(), str.begin(), toupper); transform(v1.begin(), v1.begin()+5, v2.begin(), vres.begin(), plus<int>()); sum = accumulate(v.begin(), v.end(), 0); prod = accumulate(v.begin(), v.end(), 1, multiplies<int>()); sort(v.begin(), v.end()); sort(v.begin(), v.end(), Pred); stable_sort(v.begin(), v.end()); stable_sort(v.begin(), v.end(), Pred); merge(v.begin(), v.end(), v2.begin(), v2.end(), vres.begin()); merge(v.begin(), v.end(), v2.begin(), v2.end(), vres.begin(), Pred); // Operationen für nicht initialisierte Container uninitialized_copy uninitialized_fill uninitialized_fill_n // Funktions Adaptoren bind1st(divide<int>(), 10) bind2nd(divide<int>(), 10) bind2nd(not2(less<int>()), 10) = not1(bind2nd(less<int>(), 10)) char* chNrs[] = {"10","20","30"}; int intNrs[3]; transform(chNrs, chNrs+3, intNrs, ptr_fun(atoi)); vector<string*> v; v.push_back(new string("asdf")); v.push_back(new string("asdfasdf")); vector<int> lengths(v.size()); transform(v.begin(), v.end(), lengths.begin(), mem_fun(&string::length)); vector<string> v; v.push_back("asdf"); v.push_back("asdfasdf"); vector<int> lengths(v.size()); transform(v.begin(), v.end(), lengths.begin(), mem_fun_ref(&string::length)); // generische Algorithm template <typename TIter, typename T> TIter find(TIter first, TIter second, T const &val) { while ((first != second) && (*first != val)) { first++; } return first; } template <typename TIter, typename TPred> TIter find_if(TIter first, TIter second, TPred p) { while((first != second) && !p(*first)) { first++; } return first; } template <typename TInItor, typename TOutIter> TOutIter copy(TInIter first, TInIter second, TOutIter result) { for(; first!=second; first++) { *result = *first; } return result; } // Funktoren template <typename T> class multiplies: public binary_function<T,T,T> { public: T operator() (T const &x, T const &y) const { return x*y; } }; class startsWith: public unary_function<string,bool> { public: startsWith(char ch): startCh(ch){} bool operator() (string const &str) const { return ((str.length() > 0) && (str[0] == startCh)); } private: char startCh; }; startsWith('A') class startsWithChar: public binary_function<string,char,bool> { public: bool operator() (string const &str, char ch) const { return ((str.length() > 0) && (str[0] == ch)); } }; bind2nd(startsWithChar(), 'A')