我刚开始学习C ++并且对矢量有疑问。 我正在阅读的书中指出,如果我想提取double类型的向量的大小(例如),我应该做类似的事情:
vector<double>::size_type vector_size;
vector_size = myVector.size();
而在Java中,我可能会这样做
int vector_size;
vector_size = myVector.size();
我的问题是,为什么有一个名为vector :: size_type的类型?为什么C ++不使用int?
答案 0 :(得分:23)
C ++是一种用于库编写*的语言,并且允许作者尽可能通用是其主要优势之一。而不是规定标准容器使用任何特定数据类型,更通用的方法是判定每个容器公开size_type
成员类型。这允许更大的灵活性和通用性。例如,考虑这个通用代码:
template <template <typename...> Container, typename T>
void doStuff(const Container<T> & c)
{
typename Container<T>::size_type n = c.size();
// ...
}
此代码适用于任何容器模板(可以使用单个参数进行实例化),并且我们不会对代码的用户施加任何不必要的限制。
(在实践中,大多数尺寸类型将解析为std::size_t
,而unsigned int
又是无符号类型,通常为unsigned long
或{{1}} - 但为什么我们必须知道这一点? )
*)我不确定Java的相应语句是什么。
答案 1 :(得分:6)
Java没有无符号整数类型,因此必须使用int
。
相反,C ++会在适当的地方使用它们(负值是无意义的),规范的例子就是数组之类的长度。
答案 2 :(得分:3)
C ++标准说容器的size_type
是无符号整数类型,但它没有指定哪一个;例如,一个实现可能会使用unsigned int
而另一个实现可能会使用unsigned long
。
C ++并没有像Java那样“屏蔽”特定于平台的实现细节。 size_type
别名有助于保护您的代码免受此类细节的影响,因此无论使用何种实际类型来表示矢量大小,它都能正常工作。
答案 3 :(得分:1)
我个人对此的感觉是,为了更好的代码安全性/可读性。
对我来说int
是一种没有特别含义的类型:它可以编号苹果,香蕉或其他任何东西。
size_type
,typedef
可能size_t
具有更强的含义:它表示大小,以字节为单位。
也就是说,更容易知道变量是什么意思。当然,遵循这个理由,不同单位可能会有很多不同的类型。但是“缓冲区大小”实际上是一种常见的情况,因此它应该以某种方式获得专用类型。
另一个方面是代码维护:如果容器突然将其size_type
从uint64_t
更改为unsigned int
,例如使用size_type
,则无需更改它依赖于它的每个源代码。
答案 4 :(得分:1)
您正在阅读的书中指出,如果您想提取double类型的向量的大小(例如),您应该执行以下操作:
vector<double>::size_type vector_size;
vector_size = myVector.size();
而在Java中你可能会这样做
int vector_size;
vector_size = myVector.size();
两者都是C ++中的劣等选项。第一个是非常冗长和不安全(主要是由于隐式促销)。第二个是冗长且非常不安全(由于数字范围)。
在C ++中,做
ptrdiff_t const vectorSize = myVector.size();
请注意
ptrdiff_t
标题的 stddef.h
是一种保证足够大的签名类型。
初始化在声明中完成(这是更好的C ++风格)。
相同的命名约定已应用于这两个变量。
总之,做正确的事情更短更安全。
干杯&amp;第h。,