Не предполагайте тип размера контейнера (или что-либо еще напечатанное внутри).
Сегодня
На данный момент лучшим решением является использование:
std::vector<T>::size_type
Где Т - твой тип. Например:
std::vector<std::string>::size_type i ;
std::vector<int>::size_type j ;
std::vector<std::vector<double> >::size_type k ;
(Использование typedef может помочь улучшить чтение)
То же самое относится к итераторам и всем остальным типам "внутри" контейнеров STL.
После C ++ 0x?
Когда компилятор сможет найти тип переменной, вы сможете использовать ключевое слово auto. Например:
void doSomething(const std::vector<double> & p_aData)
{
std::vector<double>::size_type i = p_aData.size() ; // Old/Current way
auto j = p_aData.size() ; // New C++0x way, definition
decltype(p_aData.size()) k; // New C++0x way, declaration
}
Редактировать: вопрос от JF
Что если ему нужно передать размер контейнера в какой-то существующий код, который использует, скажем, целое число без знака? - JF
Эта проблема характерна для использования STL: вы не можете сделать это без некоторой работы.
Первым решением является разработка кода, который всегда будет использовать тип STL. Например:
typedef std::vector<int>::size_type VIntSize ;
VIntSize getIndexOfSomeItem(const std::vector<int> p_aInt)
{
return /* the found value, or some kind of std::npos */
}
Второе - сделать преобразование самостоятельно, используя static_cast, используя функцию, которая будет утверждать, если значение выходит за границы целевого типа (иногда я вижу код, использующий "char", потому что " вы знаете, индекс никогда не превысит 256"[цитирую по памяти]).
Я полагаю, что это может быть полный вопрос сам по себе.