1// Literatur: Vorlesungsunterlagen SEN (FH Hagenberg, HSSE Semester 2)
2// C++ Referenz (http://www.cplusplus.com)
3
4// Strings
5 #include <string>
6 string s("test");
7 s.size();
8 s.clear();
9 bool isEmpty = s.empty();
10 s[0] = 'f';
11 s.at(0) = 'f';
12
13 s += "next";
14 s += str2;
15 s += 'c';
16
17 s.append(str2);
18 s.append(str2, 2, 3); // ab Zeichen 2, 3 Zeichen lang
19 s.append("asdf");
20 s.append("asdfasdf", 4); // 4 Zeichen vom String
21 s.append(10,'.'); // 10 x '.'
22 s.append(firstIter, secondIter);
23
24 s.push_back('c');
25
26 s.assign(str2);
27 s.assign(str2, 2, 3); // ab Zeichen 2, 3 Zeichen lang
28 s.assign("asdf");
29 s.assign("asdfasdf", ); // 4 Zeichen vom String
30 s.assign(10, '.'); // 10 x '.'
31 s.assign(firstIter, secondIter);
32
33 s.insert(2, str2); // String an Position 2 einfuegen
34 s.insert(2, str2, 3, 4); // String an Position 2 einfuegen,
35 // ab Zeichen 3, 4 Zeichen lang
36 s.insert(2, "asdf"); // String an Position 2 einfuegen
37 s.insert(2, "asdfasdf", 4); // String an Position 2 einfuegen,
38 // 4 Zeichen vom String
39 s.insert(2, 10, '.'); // an Position 2, 10 x '.' einfuegen
40 s.insert(iter, '.');
41 s.insert(iter, 10, '.');
42 s.insert (iter, str2.begin(), str2.end);
43
44 s.erase(iter);
45 s.erase(firstIter, secondIter);
46
47 s.replace(2, 3, str2); // String an Position 2,
48 // 3 Zeichen lang ersetzen mit str2
49 s.replace(2, 3, str2, 4, 5); // String an Position 2,
50 // 3 Zeichen lang ersetzen mit str2
51 // (ab Position 4, 5 Zeichen lang)
52 s.replace(2, 3, "asdf"); // String an Position 2,
53 // 3 Zeichen lang ersetzen mit String
54 s.replace(2, 3, "asdfasdf", 4); // String an Position 2,
55 // 3 Zeichen lang ersetzen mit str2
56 // (4 Zeichen vom String)
57 s.replace(2, 3, 10, '.'); // String an Position 2,
58 // 3 Zeichen lang ersetzen mit 10 x '.'
59 s.replace(firstIter, secondIter, str2);
60 s.replace(firstIter, secondIter, "asdf");
61 s.replace(firstIter, secondIter, "asdfasdf", 4);
62 s.replace(firstIter, secondIter, 10, '.');
63 s.replace(firstIter, secondIter, str2.begin(), str2.end());
64
65 s.copy(charArr, 2, 3); // String ab Position 2,
66 // 3 Zeichen lang in charArr kopieren
67 s.swap(str2);
68 s.c_str();
69
70 size_t position = s.find(str2);
71 if (position != string::npos)
72 ...
73 s.find(str2, 2); // Suche ab Position 2
74 s.find("asdf");
75 s.find("asdf", 2); // Suche ab Position 2
76 s.find("asdf", 2, 3); // Suche ab Position 2, 3 Zeichen lang
77 s.find('a');
78 s.find('a', 2); // Suche ab Position 2
79 s.rfind(...); // von hinten Suchen
80
81 string s("alle Selbstlaute durch Punkt ersetzen");
82 size_t position;
83 position = s.find_first_of("aeiou");
84 while (position != string::npos)
85 {
86 s[position] = '.';
87 position = s.find_first_of("aeiou", position + 1);
88 } // s = ".ll. S.lbstl..t. d.rch P.nkt .rs.tz.n."
89 s.find_last_of(...);
90 s.find_first_not_of(...);
91 s.find_last_not_of(...);
92
93 str2 = s.substr(); // str2 == s
94 str2 = s.substr(2); // von Position 2 bis zum Ende
95 str2 = s.substr(2, 3); // von Position 2, 3 Zeichen lang
96
97 s.compare(str2) == 0 // Strings gleich
98 s.compare("asdf")
99 s.compare(2, 3, str2) // s ab Position 2,
100 // 3 Zeichen lang vergleichen
101 s.compare(2, 3, str2, 4, 5) // s ab Position 2,
102 // 3 Zeichen lang mit str2 ab Position 4,
103 // 5 Zeichen lang vergleichen
104 s.compare(2, 3, "asdf") // s ab Position 2,
105 // 3 Zeichen lang vergleichen
106 s.compare(2, 3, "asdf", 4) // s ab Position 2, 3 Zeichen lang mit
107 // ".." 4 Zeichen lang vergleichen
108
109
110// Streams
111 #include <iostream>
112 cout << "text" << var << endl; // standard Ausgabe
113 cin >> intVal; // standard Eingabe
114
115 #include <fstream>
116 ofstream out("file.txt");
117 out << "text";
118 out.close();
119 .is_open()
120 .put(char c)
121 .write(const char* c, streamsize maxc)
122 .flush
123 .eof()
124 .fail()
125
126 ifstream in("file.txt");
127 in >> intVal;
128 in.close();
129 .is_open()
130 .get(char &c)
131 .getline(char *c, streamsize maxc)
132 .read(char *c, streamsize maxc)
133 .eof()
134 .fail()
135
136// String Streams
137 #include <sstream>
138 ostringstream oss;
139 oss << "text";
140 oss.str();
141
142 istringstream iss(string);
143 iss >> intVal;
144
145
146// Stream-Manipulatoren
147 hex // Hexadezimalausgabe (bis auf Widerruf)
148 oct // Oktalausgabe
149 dec // Dezimalausgabe
150
151 scientific // Exponenten Darstellung
152 fixed // normale Darstellung
153
154 setprecision(4) // Nachkommastellen fuer naechste Ausgabe
155 setw(3) // Weite der Zahl
156 setfill('0') // Fuellzeichen setzen
157
158 left // Ausrichtung
159 right
160
161 upercase // Grossschreibung
162 nouppercase
163
164 boolalpha // Ausgabe von true/false
165 noboolalpha
166
167 ostream &hr (ostream &os) // eigener Manipulator
168 {
169 os << endl;
170 os << "-------------";
171 os << endl;
172 return os;
173 }
174
175
176// Container
177// Queue - FIFO Datenstruktur
178 queue<int> q;
179 q.push(1); // fuegt Element am Ende ein
180 ivalue = q.front(); // liefert Element am Anfang
181 q.pop(); // loescht Element am Anfang
182
183// Stack - LIFO Datenstruktur
184 stack<int> s;
185 s.push(1); // fuegt Element oben ein
186 ivalue = s.top(); // liefert oberstes Element
187 s.pop(); // loescht oberstes Element
188
189// Vektor - automatisch wachsendes Array
190// + schnelles Einfuegen/Loeschen am Ende
191// + Direktzugriff mit Indexoperator
192 #include <vector>
193 vector<int> v;
194 v.push_back(0); // fuegt Element am Ende ein
195 v[0] // Zugriff auf Element an Stelle 0
196 v.erase(iter); // Element loeschen
197 v.erase(v.begin(), iter); // Bereich loeschen
198 v.empty() // Ueberpruefung ob leer
199 v.size() // Ausgabe der Groesse
200 v.pop_back(); // Element am Ende loeschen
201 v.clear(); // Container loeschen
202
203// Liste - doppelt verkettete Liste
204// + schnelles Einfuegen/Loeschen an jeder Position
205// - nur sequentiellen Zugriff (beide Richtungen)
206 #include <list>
207 list<int> l;
208 l.insert(iter, 0); // Einfuegen eines Elements an
209 // bestimmten Iterator-Position
210 l.push_front(0); // fuegt Element am Anfang ein
211 l.push_back(0); // fuegt Element am Ende ein
212 l.pop_front(); // Element am Anfang loeschen
213 l.pop_back(); // Element am Ende loeschen
214 l.front(); // liefert Element vom Anfang
215 l.back(); // liefert Element vom Ende
216 l.sort(); // Elemente sortieren
217 l.reverse(); // Ordnung der Elemente vertauschen
218 l.clear(); // Container loeschen
219 l.removeif(praedikat); // Loescht Elemente,
220 // welche Bedingung erfuellen
221 l.remove(0); // Loescht alle Elemente mit gleichen Wert
222
223// Map - assoziativer Container mit Schluessel/Werte Paar
224// (eindeutige Schluessel)
225// + Einfuegen und Suchen von Schluesseln in logarithmischer Zeit
226// + Loeschen von Schluesseln in konstanter Zeit
227// + aufsteigend geordnet nach Schluessel
228 #include <map>
229 map<string, int> m;
230 m.insert(pair<string, int>("test", 100));
231
232 pair<map<string, int>::iterator, bool> ret;
233 ret = m.insert(pair<string, int>("test", 100));
234 if (ret.second == false)
235 {
236 cout << "Element existiert bereits: " << ret.first->second << endl;
237 }
238
239 m.erase(iter);
240 m.erase("test");
241 m.erase(firstIter, secondIter);
242 m.clear();
243 m.find("test")->second;
244 m.count("test");
245 m.size();
246 m.empty();
247 m["test2"] = 50;
248
249// Set - assoziativer Container mit Schluesseln (eindeutige Schluessel)
250// + Einfuegen und Suchen von Schluesseln in logarithmischer Zeit
251// + Loeschen von Schluesseln in konstanter Zeit
252// + aufsteigend geordnet nach Schluessel
253 #include <set>
254 set<string> s;
255 s.insert("test");
256 s.erase(iter);
257 s.erase("test");
258 s.erase(firstIter, secondIter);
259 s.clear();
260 iter = s.find("test");
261 s.count("test");
262 s.size();
263 s.empty();
264
265// Bitset
266 #include<bitset>
267 bitset<4> b;
268 b.set(); // alle Bits setzen
269 b.set(2); // Bit an Position 2 setzen
270 b.set(2, true); // Bit an Position 2 setzen
271 b.set(2, false); // Bit an Position 2 loeschen
272
273 b.reset(); // alle Bits loeschen
274 b.reset(2); // Bit an Position 2 loeschen
275
276 b.flip(); // alle Bits negieren
277 b.flip(2); // Bit an Position 2 negieren
278
279 int size = b.size(); // Anzahl der Bits
280 int cnt = b.count(); // Anzahl an gesetzten Bits
281 bool erg = b.any(); // true, wenn irgend ein Bit gesetzt
282 bool erg = b.none(); // true, wenn kein Bit gesetzt
283 bool erg = b.test(2); // true, wenn Bit an Position 2 gesetzt
284
285
286 dequeue // ... double ended queue
287 // + schnelles Einfuegen/Loeschen am Anfang und am Ende
288 slist // ... einfach verkettete Liste
289 // + benoetigt weniger Speicher
290 // - Durchlauf nur in eine Richtung
291 multimap // ... Schluessel/Werte Paare
292 // (mehrfache Verwendung von Schluessel erlaubt)
293 multiset // ... Schluessel (mehrfache Verwendung von Schluessel erlaubt)
294
295
296// Iteratoren
297 vector<int>::iterator iter = vec.begin();
298 vector<int>::const_iterator citer = vec.end();
299 vector<int>::reverse_iterator riter = vec.rbegin();
300 vector<int>::reverse_const_iterator rciter = vec.rend();
301
302 back_inserter(Container)
303 forward_inserter(Container)
304 inserter(Container, Container.end())
305
306 distance(firstIter, secondIter) // Abstand der Iteratoren
307 advance(Iter, distance) // Iterator weiter setzen
308
309// Stream Iteratoren
310 istream_iterator<int> in(cin);
311 istream_iterator<int> eos;
312 copy(in, eos, back_inserter(vec));
313
314 ostream_iterator<int> out(cout, " ");
315 copy(vec.begin(), vec.end(), out);
316
317
318// Praedikate
319 bool Pred(int x, int y) // true ... Aktion wird ausgefuehrt
320 { // false ... Aktion wird nicht ausgefuehrt
321 return x > y;
322 }
323
324 bool Pred(int x)
325 {
326 return x >= 0;
327 }
328
329 plus<>
330 minus<>
331 multiplies<>
332 divides<>
333 modulus<>
334 negate<>
335
336 logical_and<>
337 logical_not<>
338 logical_or<>
339
340 equal_to<>
341 not_equal_to<>
342 greater<>
343 greater_equal<>
344 less<>
345 less_equal<>
346
347
348// Algorithmen
349 #include <algorithm>
350 fill(v.begin(), v.end(), 0);
351 fill_n(v.begin(), 3, 0);
352 fill_n(back_inserter(v), 10, 0);
353
354 generate(v.begin(), v.end(), Func);
355 generate(v.begin(), 3, Func);
356
357 copy(c1.begin(), c1.end(), back_inserter(c2));
358 copy(c1.begin(), c1.end(), ostream_iterator<int>(cout, " "));
359 copy_backward(c1.begin(), c1.end(), ...);
360
361 iter = find(v.begin(), v.end(), 5);
362 iter = find_if(v.begin(), v.end(), Pred);
363
364 count(v.begin(), v.end(), Elem);
365 count_if(v.begin(), v.end(), Pred);
366 for_each(v.begin(), v.end(), Func);
367 bool vorhanden = binary_search(v.begin(), v.end(), 5);
368
369 bool gleich = equal(v.begin(), v.end(), v2.begin());
370 bool gleich = equal(v.begin(), v.end(), v2.begin(), Pred);
371 bool kleiner = lexicographical_compare(v.begin(), v.end(),
372 v2.begin(), v2.end());
373 bool kleiner = lexicographical_compare(v.begin(), v.end(),
374 v2.begin(), v2.end(), Pred);
375
376 elemC = max(elemA, elemB);
377 elemC = max(elemA, elemB, Pred);
378 iterC = max_element(v.begin(), v.end());
379 iterC = max_element(v.begin(), v.end(), Pred);
380 min
381 min_element
382
383 transform(v.begin(), v.end(), v.begin(), negate<int>());
384 transform(str.begin(), str.end(), str.begin(), toupper);
385 transform(v1.begin(), v1.begin()+5, v2.begin(),
386 vres.begin(), plus<int>());
387
388 sum = accumulate(v.begin(), v.end(), 0);
389 prod = accumulate(v.begin(), v.end(), 1, multiplies<int>());
390
391 sort(v.begin(), v.end());
392 sort(v.begin(), v.end(), Pred);
393 stable_sort(v.begin(), v.end());
394 stable_sort(v.begin(), v.end(), Pred);
395
396 merge(v.begin(), v.end(), v2.begin(), v2.end(), vres.begin());
397 merge(v.begin(), v.end(), v2.begin(), v2.end(), vres.begin(), Pred);
398
399
400// Operationen fuer nicht initialisierte Container
401 uninitialized_copy
402 uninitialized_fill
403 uninitialized_fill_n
404
405
406// Funktions Adaptoren
407 bind1st(divide<int>(), 10)
408 bind2nd(divide<int>(), 10)
409
410 bind2nd(not2(less<int>()), 10) = not1(bind2nd(less<int>(), 10))
411
412 char* chNrs[] = {"10","20","30"};
413 int intNrs[3];
414 transform(chNrs, chNrs+3, intNrs, ptr_fun(atoi));
415
416 vector<string*> v;
417 v.push_back(new string("asdf"));
418 v.push_back(new string("asdfasdf"));
419 vector<int> lengths(v.size());
420 transform(v.begin(), v.end(), lengths.begin(), mem_fun(&string::length));
421
422 vector<string> v;
423 v.push_back("asdf");
424 v.push_back("asdfasdf");
425 vector<int> lengths(v.size());
426 transform(v.begin(), v.end(), lengths.begin(),
427 mem_fun_ref(&string::length));
428
429
430
431
432// generische Algorithm
433 template <typename TIter, typename T>
434 TIter find(TIter first, TIter second, T const &val)
435 {
436 while ((first != second) && (*first != val))
437 {
438 first++;
439 }
440 return first;
441 }
442
443 template <typename TIter, typename TPred>
444 TIter find_if(TIter first, TIter second, TPred p)
445 {
446 while((first != second) && !p(*first))
447 {
448 first++;
449 }
450 return first;
451 }
452
453 template <typename TInItor, typename TOutIter>
454 TOutIter copy(TInIter first, TInIter second, TOutIter result)
455 {
456 for(; first!=second; first++)
457 {
458 *result = *first;
459 }
460 return result;
461 }
462
463
464// Funktoren
465 template <typename T>
466 class multiplies: public binary_function<T,T,T>
467 {
468 public:
469 T operator() (T const &x, T const &y) const
470 {
471 return x*y;
472 }
473 };
474
475 class startsWith: public unary_function<string,bool>
476 {
477 public:
478 startsWith(char ch): startCh(ch){}
479 bool operator() (string const &str) const
480 {
481 return ((str.length() > 0) && (str[0] == startCh));
482 }
483 private:
484 char startCh;
485 };
486 startsWith('A')
487
488 class startsWithChar: public binary_function<string,char,bool>
489 {
490 public:
491 bool operator() (string const &str, char ch) const
492 {
493 return ((str.length() > 0) && (str[0] == ch));
494 }
495 };
496 bind2nd(startsWithChar(), 'A')