在哪里可以查找C++ STL中vector的size_type定义?

Tom*_*ert 6 c++ size stl vector

将vector向量size()函数的结果转换为an 似乎是安全的unsigned int.但是我怎么能确定呢?我的文档不清楚如何size_type定义.

pae*_*bal 11

不要假设容器大小的类型(或其他任何内部类型).

今天?

现在最好的解决方案是使用:

std::vector<T>::size_type
Run Code Online (Sandbox Code Playgroud)

T是你的类型.例如:

std::vector<std::string>::size_type i ;
std::vector<int>::size_type j ;
std::vector<std::vector<double> >::size_type k ;
Run Code Online (Sandbox Code Playgroud)

(使用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
}
Run Code Online (Sandbox Code Playgroud)

编辑:来自JF的问题

如果他需要将容器的大小传递给一些使用unsigned int的现有代码,该怎么办? - 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 */
}
Run Code Online (Sandbox Code Playgroud)

第二个是自己进行转换,使用static_cast,使用一个函数,如果值超出目标类型的边界将断言(有时,我看到代码使用"char",因为," 你知道,索引将会永远不要超过256 "[我引用记忆]).

我相信这本身就是一个完整的问题.


Kon*_*lph 4

根据标准,你无法确定。确切的类型取决于您的机器。不过,您可以查看编译器标头实现中的定义。