C++矢量大小类型

C++ vector size types

本文关键字:小类 类型 C++      更新时间:2023-10-16

我刚开始学习C++,对向量有疑问。我正在阅读的书指出,如果我想提取双精度类型的向量的大小(例如(,我应该执行以下操作:

vector<double>::size_type vector_size;
vector_size = myVector.size();

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

int vector_size;
vector_size = myVector.size();

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

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 intunsigned long - 但为什么我们必须知道呢?

*( 我不确定 Java 的相应语句是什么。

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

相反,C++在适当的时候使用它们(负值是无意义的(,规范的例子是数组之类的东西的长度。

C++标准说容器的size_type是无符号的整型类型,但它没有指定是哪一种;例如,一个实现可能使用unsigned int,另一个可能使用unsigned long

C++不像Java那样"屏蔽"特定于平台的实现细节。 size_type别名有助于保护代码免受此类细节的影响,因此无论应使用哪种实际类型来表示矢量的大小,它都可以正常工作。

我个人对此的感觉是,这是为了更好的代码安全性/可读性。

对我来说int是一种没有特殊含义的类型:它可以给苹果、香蕉或任何东西编号。

size_type ,这可能是size_ttypedef,具有更强的含义:它表示大小,以字节为单位。

也就是说,更容易知道变量的含义。当然,按照这个原理,不同的单位可能有很多不同的类型。但是"缓冲区大小"确实是一种常见情况,因此它以某种方式值得使用专用类型。

另一个方面是代码可维护性:例如,如果容器突然将其size_typeuint64_t更改为unsigned int,使用size_type,您不必在每个依赖它的源代码中更改它。

你正在阅读的书指出,如果你想提取双精度类型的向量的大小(例如(,你应该做这样的事情:

    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++样式更好(。

  • 相同的命名约定已应用于这两个变量。

总之,做正确的事更短、更安全。

干杯和hth.,