/* * List operations * */ template <class T, class A = allocator<T> > class vector { public: // ... // list operations: iterator insert(iterator pos, const T& x); // add x before pos void insert(iterator pos, size_type n, const T& x); // add n copies of x before pos template <class In> // In must be an input iterator void insert(iterator pos, In first, In last); // insert elements from sequence iterator erase(iterator pos); // remove element at pos iterator erase(iterator first, iterator last); // erase sequence void clear(); // erase all elements // ... }; /* * Usage of list operations * */ void duplicate_elements(vector<string>& f) { for(vector<string>::iterator p = f.begin(); p!=f.end(); ++p) f.insert(p,*p); // No! } template<class C> void f(C& c) { c.erase(c.begin()+7); // ok (if c's iterators support + ) c.erase(&c[7]); // not general c.erase(c+7); // error: adding 7 to a container makes no sense c.erase(c.back()); // error: c.back() is a reference, not an iterator c.erase(c.end()-2); // ok (second to last element) c.erase(c.rbegin()+2); // error: vector::reverse_iterator and vector::iterator // are different types c.erase((c.rbegin()+2).base()); // obscure, but ok }