unsigned int's were popular in C, particularly where 16 bit int's were common. In modern C and particularly C++ the main reason to choose unsigned over signed is to have well-defined behavior for >> and for overflow. When using stl containers and your own containers the proper and correct way of handleing the return value of size() is to use vector<>::size_type, and to declare your own simmilar typedef's.
Code:
template<class T>
void printvec(const std::vector<T> &v, std::ostream &os=std::cout) {
os << '{';
if(v.size() > 0) {
typedef typename std::vector<T>::size_type st;
const st last = v.size()-1;
for(st i=0;i<last;++i) {
os << v[i] << ", ";
}
os << v[last];
}
os << '}';
}
Now if size begins returning unsigned long long, you are set. Anytime somthing returns size_t or anything else defined with a typedef, use that type. For your own objects, if there is any reason to change something provide a typedef. For age, use an int.