To present the overall organization and examples of the use of the C++ Standard Library so that:
#include <iostream> #include <string> int main(int argc, char** argv) { std::string name; if (argc > 1) name = argv[1]; else std::cin >> name; std::cout << "Hello, " + name; return 0; }
#include <iostream> #include <string> using namespace std; int main(int argc, char** argv) { string name; if (argc > 1) name = argv[1]; else cin >> name; cout << "Hello, " + name; return 0; }
The standard library was created many years after C++ itself.
The Standard Library is comprised of 50 modules (18 are from C):
<algorithm>, <bitset>, <cassert>, <cctype>, <cerrno>, <cfloat>, <ciso646>, <climits>, <clocale>, <cmath>, <complex>, <csetjmp>, <csignal>, <cstdarg>, <cstddef>, <cstdio>, <cstdlib>, <cstring>, <ctime>, <cwchar>, <cwctype>, <deque>, <exception>, <fstream>, <functional>, <iomanip>, <ios>, <iosfwd>, <iostream>, <istream>, <iterator>, <limits>, <list>, <locale>, <map>, <memory>, <new>, <numeric>, <ostream>, <queue>, <set>, <sstream>, <stack>, <stdexcept>, <streambuf>, <string>, <typeinfo>, <utility>, <valarray>, <vector>It is useful to group the 50 modules into ten informal categories:
The containers in the standard library are found in these modules:
<vector> | one-dimensional arrays |
<list> | doubly-linked lists |
<deque> | double-ended queues |
<queue> | FIFO queues and priority queues |
<stack> | stacks |
<map> | dictionaries (associative arrays) |
<set> | sets |
<bitset> | bit sequences |
#include <iostream> #include <list> #include <string> using namespace std; int main(int, char**) { list<string> names; // default constructor makes it empty names.push_back("dva"); names.push_front("odin"); names.push_back("tri"); for (list<string>::iterator i = names.begin(); i != names.end(); i++) { cout << *i << '\n'; } return 0; }
#include <iostream> #include <map> #include <string> using namespace std; int main(int, char**) { map<string, int> m; m["juan"] = 19; m["svetlana"] = 26; cout << m["ciaran"] << '\n'; map<string, int>::iterator i = m.find("juan"); if (i != m.end()) { cout << (*i).second << '\n' << m.size() << '\n'; } }
<utility> | operators and pairs |
<functional> | function objects |
<memory> | allocators for containers |
<iterator> | iterators |
<algorithm> | general algorithms |
The header <cstdlib> contains bsearch() and qsort() which are underpowered, useless and inefficient.
<algorithm> contains, among others, for_each(), find(), find_if(), count(), count_if(), search(), equal(), copy(), swap(), replace(), fill(), remove(), remove_if(), unique(), reverse(), random_shuffle(), sort(), merge(), partition(), binary_search(), includes(), set_union(), make_heap(), min(), max(), next_permutation()
#include <iostream> #include <algorithm> #include <functional> #include <vector> using namespace std; int main(int, char**) { vector<int> a; for (int i = 0; i < 100; i++) a.push_back(i); random_shuffle(a.begin(), a.begin()+75); for (int i = 0; i < a.size(); i++) cout << a[i] << ' '; sort(a.begin(), a.end(), greater<int>()); for (int i = 0; i < a.size(); i++) cout << a[i] << ' '; }
<stdexcept> | defines some standard exception classes thrown by many library operations |
<cassert> | contains the assert() macro |
<cerrno> | C-style error handling, needed to support legacy code |
#include <iostream> #include <string> using namespace std; int main(int, char**) { string s1 = "Hello", s2("Goodbye"), s3, s4(s2, 4,3); s3 = s1; s3[1] = 'u'; cout << s1 << ' ' << s3 << s2.length() << '\n'; string message = s1 + ',' + " then " + s2; message.replace(7, 4, "and"); cout << message << s4 << ' ' << s2.find('y') << '\n'; }
<ios> | basic stream types and ops |
<streambuf> | buffers for streams |
<istream> | input stream template class |
<ostream> | output stream template class |
<iostream> | standard streams like cin and cout |
<fstream> | files to/from streams |
<sstream> | strings to/from streams |
<iomanip> | some stream manipulators |
#include <iostream> #include <iomanip> #include <fstream> #include <stdexcept> using namespace std; int main(int, char**) { ifstream f; double x; f.open("numbers.txt"); if (!f) throw new runtime_error("missing file"); while (true) { f >> x; if (f.bad()) throw new runtime_error("corrupted"); if (f.fail()) {if (f.eof()) break; else throw new runtime_error("junk");} cout << fixed << setprecision(4) << x << '\n'; } // note stream f closed in destructor } // note catching and reporting runtime_errors omitted for space
The header <locale> contains a class called locale, other classes such as money_get and money_put, and a number of operations such as isalpha(), isdigit(), isalnum(), isspace(), ispunct(), iscntrl(), isupper(), islower(), toupper(), tolower()
<limits> | numeric limits |
<new> | dynamic memory management |
<typeinfo> | RTTI support |
<exception> | exception class |
In addition there are several headers from the C library: <climits>, <cfloat>, <cstddef>, <cstdarg>, <csetjmp>, <cstdlib>, <ctime>, <csignal>
<complex> | a class for complex numbers |
and many global operations
<valarray> | numeric vectors and operations |
<numeric> | generalized numeric operations: accumulate(), partial_sum(), adjacent_difference(), inner_product() |
<cmath> | mathematical functions |
<cstdlib> | C-style random numbers and abs(), fabs(), div() |