C++矢量大小类型

16 c++ int vector

我刚开始学习C++并且对向量有疑问.我正在阅读的书中指出,如果我想提取double类型的向量的大小(例如),我应该做类似的事情:

vector<double>::size_type vector_size;
vector_size = myVector.size();
Run Code Online (Sandbox Code Playgroud)

而在Java中,我可能会这样做

int vector_size;
vector_size = myVector.size();
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么有一个名为vector :: size_type的类型?为什么C++不使用int?

Ker*_* SB 23

C++是一种用于库编写*的语言,并且允许作者尽可能通用是其主要优势之一.而不是规定标准容器使用任何特定数据类型,更通用的方法是判定每个容器公开一个size_type成员类型.这允许更大的灵活性和通用性.例如,考虑这个通用代码:

template <template <typename...> Container, typename T>
void doStuff(const Container<T> & c)
{
  typename Container<T>::size_type n = c.size();
  // ...
}
Run Code Online (Sandbox Code Playgroud)

此代码适用于任何容器模板(可以使用单个参数进行实例化),并且我们不会对代码的用户施加任何不必要的限制.

(在实践中,大多数大小类型将解析为std::size_t,通常是无符号类型,通常unsigned intunsigned long- 但为什么我们必须知道?)

*)我不确定Java的相应语句是什么.


GMa*_*ckG 6

Java没有无符号整数类型,因此必须使用它们int.

相反,C++在适当的地方使用它们(负值是无意义的),规范的例子是类似数组的长度.

  • 标准使用`size_t`而不是`int`的原因是因为在一些较小的机器上,`int`不够大(而且`long`会导致性能损失).这里使用无符号类型通常被认为是一个缺陷,因为C和C++中的无符号类型以某种有趣的方式工作.(基本上,像`abs(i1 - i2)`这样的表达式应该正确地给出两种索引类型之间的距离.如果`i1`或`i2`是无符号的,它就不会.) (3认同)