我目前正在将应用程序转换为64位。 我有一些出现以下模式:
class SomeOtherClass;
class SomeClass
{
std::vector<SomeOtherClass*> mListOfThings;
void SomeMemberFunction (void)
{
// Needs to know the size of the member list variable
unsigned int listSize = mListOfThings.size();
// use listSize in further computations
//...
}
}
显然在实际情况下,我的列表中不会有更多MAX_INT项。但我想知道是否就代表这种类型的“最佳”方式达成共识。
每个集合为size()定义自己的返回类型,所以我的第一个近似值是:
std::vector<SomeOtherClass*>::size_type listSize = mListOfThings.size()
我认为这是正确的,但(个人而言)我没有发现这个“易读”,所以-1为清晰起见。
对于c ++ 011感知编译器,我可以编写
auto listSize = mListOfThings.size()
显然更具可读性。
所以我的问题是,后者确实是在变量中处理容器大小并在计算中使用它们的最佳方法,无论底层架构如何(win32,win64,linux,macosx)?
答案 0 :(得分:2)
您想要使用的是您希望代码“纯粹”的问题。
如果您使用的是C ++ 11,则可以使用auto
并完成。
否则,在极其通用的代码(设计用于任意分配器)中,您可以使用容器的嵌套typedef size_type
。这是从容器的分配器逐字逐句。
在标准库容器的正常使用中,您可以使用std::size_t
。这是默认分配器使用的size_type
,并且是保证能够存储任何对象大小的类型。
我不建议使用[unsigned] int
,因为它可能比64位平台上的必要小(它通常保留在32位,但这当然取决于编译器和设置)。我实际上看到生产代码失败,因为unsigned int
不足以索引容器。
答案 1 :(得分:1)
这取决于为什么你需要的尺寸,以及将会是什么
在向量中。在内部,vector
使用std::size_t
。但
这是一个无符号类型,不适合数值。如果
你只想显示价值,或者其他什么,但是,如果
你以任何方式使用它作为数值,
无条件最终会咬你。
实际上,很多时候语义都是如此
代码确保值的数量不能超过
INT_MAX
。例如,在评估金融工具时,
元素的最大数量小于20000,所以没有
需要担心溢出int
。在其他情况下,
您将首先验证您的输入,以确保存在
永远不会溢出如果你不能这样做,最好的解决方案是
可能ptrdiff_t
(这是你减去的类型
到迭代器)。或者,如果您使用的是非标准分配器,
MyVectorType::difference_type
。
答案 2 :(得分:0)
不确定您是否已经考虑过此问题,但size_t
出了什么问题?
它是编译器用于内置容器(即数组)大小的内容。