不要假设容器大小的类型(或在其中键入的任何其他内容)。
Today?
目前最好的解决方案是使用:
std::vector<T>::size_type
其中 T 是您的类型。例如:
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“[我凭记忆引用])。
我相信这本身就是一个完整的问题。