标签:either cat empty hang sign scalar rand defaults exception
<deque> A deque (double ended queue) is just like a vector, but optimized for adding and removing elements at either end in O(1) time. It lacks reserve() and capacity() and adds v.push_front(x) // v.insert(v.begin(), x) v.pop_front() // v.erase(v.begin()) <list> A list is like a deque but optimized for insert and erase at any point at the cost of random access. It lacks [] (indexing), and its iterators are bidirectional, not supporting [], +, -, <, >, <=, or >=. list adds v.splice(d, v2, b); // Move *b from list v2 to in front of d in v v.splice(d, v2); // Move all elements of list v2 to in front of d in v v.splice(d, v2, b, e); // Move [b,e) in v2 to in front of d at v v.remove(x); // Remove all elements equal to x v.remove_if(f); // Remove elements x where f(x) is true v.sort(); // Sort list v.sort(f); // Sort list using function bool f(x,y) instead of x < y v.merge(v2); // Merge sorted list v2 into sorted list v v.merge(v2, f); // Merge using f(x,y) instead of x < y to sort v v.unique(); // Remove duplicates from sorted list v.unique(f); // Use f(x,y) instead of x == y v.reverse(); // Reverse order of elements Iterators can only be moved one element at a time using ++ or --, and compared using == or !=. char* cp="ABCDE"; list<char> v(cp, cp+5); // v.size() is 5 for (list<char>::const_iterator p=v.begin(); p!=v.end(); ++p) // Print ABCDE cout << *p; <map> A map<K,V> m is a set of key-value pairs with unique, sorted keys of type K and values of type V. m[k] efficiently (O(log n) time) returns the value associated with k (as an lvalue), or creates a default value (0 if V is numeric) if k is used for the first time. A map iterator points to a pair<const K, V>, which has members first of type const K and second of type V. pair<K,V> x(k,v); // Create a pair x containing copies of k and v x.first // k x.second // v x=make_pair(k,v) // x.first=k; x.second=v; map<K,V> m; // map sorted by < on K map<K,V,f>() // map sorted by f(x,y) instead of x<y on K m[k]=v; // Associate v (type V) with unique key k of type K m[k] // Retrieve v, or associate V() with k if new m.size() // Number of unique keys m.empty() // true if m.size() == 0 map<K,V>::iterator // bidirectional, points to a pair<const K, V> map<K,V>::const_iterator // points to a pair<const K, const V> m.begin() // Points to first pair (lowest k) m.end() // Points 1 past last pair m.find(k) // Points to pair containing k or m.end() if not found m.erase(k) // Remove key K and its associated value m.erase(b) // Remove pair pointed to by iterator b m.erase(b, e) // Remove sequence [b, e) m.clear() // Make empty: m.erase(m.begin(), m.end()) m==m2 // Compare maps, also !=, <, <=, >, >= We use m.find(k) rather than m[k] when we wish to look up k without increasing the size of m if k is not found. // Read words, print an alphabetical index of words with their counts string s; map<string, int> m; while (cin >> s) ++m[s]; for (map<string, int>::const_iterator p=m.begin(); p!=m.end(); ++p) cout << p->first << " " << p->second << endl; A multimap is a map that allows duplicate keys. It support all map operations except []. Elements are added by inserting a pair<K,V> and retrieved by m.equal_range(k) which returns a pair of iterators defining the sequence of pairs matching k. multimap<K,V,f> m; // f defaults to < on K m.insert(make_pair(k,v)) // Insert a pair pair<multimap<K,V,f>::iterator, multimap<K,V,f>::iterator> p = m.equal_range(k) // Sequence with key k is [p->first, p->second) f (when used as a template argument) is a functoid (or function object), a class that looks like a function by overloading (). For example: template <class T> class GreaterThan { public: bool operator()(const T& a, const T& b) const {return b < a;} }; map<string, int, GreaterThan<T> > m; // keys sorted in reverse order Some function objects can be found in <functional>. <set> A set<K> and multiset<K> are like a map and multimap, but without values. Iterators point to a K rather than a pair. There is no [] operator. set<K> m; // Elements are sorted by < on K m.insert(k) // Add an element m.erase(k) // Remove an element m.find(k)!=m.end() // Test if k is in m <queue> A queue is a container in which elements are inserted at the back and removed from the front. This could also be done with a deque or list, so no new capabilities are provided. A queue does not support iterators or indexing. queue<T> q; // Queue of type T q.size() // Number of items in q q.empty() // true if q.size() == 0 q.push(x) // Put x in the back x=q.back() // The item last pushed, may be assigned to x=q.front() // The next item to pop, may be assigned to q.pop() // Remove the front item A priority_queue is more useful. It sorts the items as they are pushed so that the largest is on top and removed first. priority_queue<T> q; // Element type is T priority_queue<T, vector<T>, f> q; // Use functoid f(x,y) instead of x < y to sort q.size(), q.empty() // As before q.push(x) // Insert x x=q.top() // Largest item in q, cannot be assigned to q.pop() // Remove top item <stack> Items are popped from the top of a stack in the reverse order in which they were pushed. It does not provide any new functionality beyond a vector, deque, or list, and does not support iterators or indexing. stack<T> s; // Stack with elements of type T s.size(), s.empty() // As with queue s.push(x); // Put x on top x=s.top(); // Last item pushed, may be assigned to s.pop(); // Remove the top item <bitset> A bitset<N> is like a vector<bool> with fixed size N, but without iterators, and supporting logical operators like an N-bit int. Its elements have the values 0 or 1. It is implemented efficiently, with 8 elements per byte. bitset<N> b; // N-bit bitset, N must be a compile time constant bitset<N> b=x; // Initialize b[0]..b[31] from bits of long x b[i] // i‘th bit, 0 <= i < N or throw out_of_range() b.size() // N, cannot be changed b.set(i) // b[i] = 1 b.reset(i) // b[i] = 0 b.flip(i) // b[i] = 1 - b[i] b.test(i) // true if b[i] == 1 b.set() // Set all bits, also b.reset(), b.flip() b & b2 // Bitwise AND, also | ^ ~ << >> &= |= ^= <<= >>= == != b.count() // Number of bits set to 1 b.any() // true if b.count() > 0 b.none() // true if b.count() == 0 cin >> b // Read bits as ‘0‘ and ‘1‘ e.g. "10101" cout << b // Write bits as ‘0‘ and ‘1‘ bitset<N> b(s); // Initialize from string s of ‘0‘ and ‘1‘ or throw invalid_argument() s=b.template to_string<char>() // Convert to string x=b.to_ulong() // Convert to unsigned long, throw overflow_error() if bits > 31 set <valarray> A valarray is like a fixed sized array or vector that supports arithmetic operations on all the elements at once. For instance, if x and y are valarrays of the same size, then x+y is a valarray containing the sums of the corresponding elements. Likewise, y=sqrt(x) assigns y[i]=sqrt(x[i]) to each element of y. In mixed type expressions, a scalar (element of type T) is promoted to a valarray of the same size by duplicating it, e.g. x+1 adds 1 to all elements of x. valarray<T> v(n); // n elements of type T, initially T() or 0 valarray<T> v(x, n); // n copies of x (note arguments are backwards) valarray<T> v(a, n); // Initialize from array a[0]..a[n-1] valarray<T> v; // size is 0 v.size() // Number of elements, n v[i] // i‘th element, 0 <= i < n, not checked v+=x, v+=v // Add x or v[i] to all v[i], also = -= *= /= %= ^= &= |= <<= >>= v+v, v+x, x+v // Also - * / % ^ & | << >> and unary + - ~ ! sqrt(v) // Also all functions in cmath x=v.sum() // Sum of all elements v.shift(n) // Move all v[i] to v[i+n], shift in 0 v.cshift(n) // Move v[i] to v[(i+n) % v.size()] v.resize(n) // Change size to n, but reset all elements to 0 v.resize(n, x) // Change size to n, set all elements to x <complex> A complex supports complex arithmetic. It has real and imaginary parts of type T. Mixed type expressions promote real to complex (e.g. double to complex<double> and lower precision to higher precision (e.g. complex<int> to complex<double>). complex<T> x; // (0,0), T is a numeric type complex<T> x=r; // (r,0), convert real r to complex complex<T> x(r, i); // (r,i) x=polar<T>(rho, theta); // Polar notation: radius, angle in radians x.real() // r x.imag() // i abs(x) // rho = sqrt(r*r+i*i) arg(x) // tan(theta) = i/r norm(x) // abs(x)*abs(x) conj(x) // (r,-i) x+y // Also - * / == != = += -= *= /= and unary + - sin(x) // Also sinh, sqrt, tan, tanh, cos, cosh, exp, log, log10, pow(x,y) cout << x // Prints in format "(r,i)" cin >> x // Expects "r", "(r)", or "(r,i)" <stdexcept>, <exception> The standard library provides a hierarchy of exception types. Not all of them are used by the library, but any may be thrown. Type Header Thrown by exception stdexcept, exception logic_error stdexcept length_error stdexcept domain_error stdexcept out_of_range stdexcept .at(i) (vector/string/deque index out of bounds) invalid_argument stdexcept, bitset bitset("xxx") (not ‘0‘ or ‘1‘) runtime_error stdexcept range_error stdexcept overflow_error stdexcept underflow_error stdexcept bad_alloc new new, new[] (out of memory) bad_cast typeinfo dynamic_cast<T&> (can‘t convert to derived) bad_typeid typeinfo typeid(*p) when p==0 bad_exception exception ios_base::failure ios, iostream, fstream istream::clear(), ostream::clear() Catching a base class catches all derived classes, thus catch(exception e) catches all of the above types. However, C++ allows throwing exceptions not derived from exception, so this may not catch everything. All exceptions provide the following interface: throw exception(msg) // Throw exception with char* or string msg throw exception(); // Default msg catch(exception e) {e.what();} // msg as a char* New exceptions may be derived from existing types to maintain this interface (see inheritance). class MyError: public exception { public: MyError(const string& msg=""): exception(msg) {} }
标签:either cat empty hang sign scalar rand defaults exception
原文地址:http://www.cnblogs.com/enyala/p/7780527.html