将我的向量size()
函数的结果转换为unsigned int
. 不过,我怎么能确定呢?我的文档不清楚如何size_type
定义。
7 回答
不要假设容器大小的类型(或里面输入的任何其他内容)。
今天?
目前最好的解决方案是使用:
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 " [我从记忆中引用])。
我相信这本身就是一个完整的问题。
根据标准,你不能确定。确切的类型取决于您的机器。不过,您可以查看编译器头文件实现中的定义。
我无法想象它在 32 位系统上是不安全的,但 64 位可能是个问题(因为整数仍然是 32 位)。为了安全起见,为什么不将变量声明为 vector<MyType>::size_type 而不是 unsigned int?
C++ 标准仅声明size_t在 <cstddef> 中,这将标识符放在 <stddef.h> 中。我的Harbison & Steele副本将size_t的最小值和最大值放在 <stdint.h> 中。这应该让您了解您的平台需要多大的收件人变量。
您最好的选择是坚持使用足够大以在您的平台上保存指针的整数类型。在 C99 中,这将是intptr_t和uintptr_t,也正式位于 <stdint.h> 中。
将其转换为 size_t 应该始终是安全的。unsigned int 在大多数 64 位系统上是不够的,甚至 unsigned long 在 Windows 上也不够(它使用 LLP64 模型而不是大多数类 Unix 系统使用的 LP64 模型)。
只要您确定系统上的 unsigned int 足够大以容纳向量中的项目数量,您就应该是安全的;-)
我不确定这将如何运作,因为我只是在想我的头脑,但是编译时断言(例如BOOST_STATIC_ASSERT()
或参见在 C 中构建时断言表达式的方法)可能会有所帮助。就像是:
BOOST_STATIC_ASSERT( sizeof( unsigned int) >= sizeof( size_type));