The most common use of containers is to store values held directly (e.g.,
vector<int> ,
set<string> ). For containers of pointers: If the container owns the pointed-to objects, prefer a container of reference-counted smart pointers (e.g.,
list<shared_ptr<Widget> > ); otherwise, a container of raw pointers (e.g.,
list<Widget*> ) or of other pointer-like values such as iterators (e.g.,
list< vector<Widget>::iterator > ) is fine.