Я обычно делаю что-то вроде следующего:
class MyClass {
public:
const unsigned int GetNumberOfItems() { return v.size(); }
T* GetItemNumber(const unsigned int n)
{
// 3 options here, thrown your own exception type, or use the std one, or
// or just return NULL meaning nothing there or out of range.
try{
return v.at(n);
} catch (std::out_of_range &e){
}
return NULL;
}
vector<T> v;
};
Тогда вы можете просто сделать что-то вроде:
MyClass cl;
int count = cl.GetNumberOfItems();
for (int i = 0; i < cl.GetNumberOfItems(); i++){
T* item = cl.GetItemNumber(i);
}
Никаких итераторов для внешнего мира не требуется. Если вам когда-либо приходилось выставлять что-то подобное стандартному C API, тогда это очень легко разоблачить.