T t, u; vector v; // declare a vector; v.size();// is 0 v.push_back(t); // put t on end of v. Other containers have push_front() also. v.push_back(t); v.size();// is 2 v.resize(3); v.size(); // is 3, entries are t, t, d, where d is the default value of T. u = v[0]; // u is t v[2] = u; // operator[] returns an lval. v[3]; // is invalid, garbage or seg fault optional info (but iterators are essential for other containers). vector::iterator p; // pointer into vector v.begin(); //iterator pointing to v[0]. v.end(); //iterator pointing to v[v.size()], an invalid location. // standard use of iterator: for (p = v.begin(); p != v.end(); ++p) { process *p } w.resize(n, t); // if n > current size, fill in with t instead of default. redundant, forgettable functions int n; cin >> n; vector w(n); // equiv: vector w; w.resize(n); vector w(n, t); // equiv: vector w; w.resize(n, t); w.clear() // equiv: w.resize(0) w.empty() // equiv: w.size() == 0 w.front() // equiv w[0] w.back() // equiv w[w.size()-1] Key points. vector indexing is zero based (like C++ arrays); T [100] a; a[0]; vector v; v[0]; Size can be determined (and re-determined) at runtime with v.resize(n). (unlike arrays) Size can be incrementally grown with v.push_back(t) (very unlike arrays) Performance is quite similar to arrays. Conclusion: even when an array will do, always use a vector.