C ++矢量大小类型

时间:2011-10-03 14:23:09

标签: c++ vector int

我刚开始学习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?

5 个答案:

答案 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_typetypedef可能size_t具有更强的含义:它表示大小,以字节为单位。

也就是说,更容易知道变量是什么意思。当然,遵循这个理由,不同单位可能会有很多不同的类型。但是“缓冲区大小”实际上是一种常见的情况,因此它应该以某种方式获得专用类型。

另一个方面是代码维护:如果容器突然将其size_typeuint64_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。,