C++矢量大小类型
C++ vector size types
我刚开始学习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 int
或unsigned long
- 但为什么我们必须知道呢?
*( 我不确定 Java 的相应语句是什么。
Java 没有无符号整数类型,因此它们必须使用 int
。
相反,C++在适当的时候使用它们(负值是无意义的(,规范的例子是数组之类的东西的长度。
C++标准说容器的size_type
是无符号的整型类型,但它没有指定是哪一种;例如,一个实现可能使用unsigned int
,另一个可能使用unsigned long
。
C++不像Java那样"屏蔽"特定于平台的实现细节。 size_type
别名有助于保护代码免受此类细节的影响,因此无论应使用哪种实际类型来表示矢量的大小,它都可以正常工作。
我个人对此的感觉是,这是为了更好的代码安全性/可读性。
对我来说int
是一种没有特殊含义的类型:它可以给苹果、香蕉或任何东西编号。
size_type
,这可能是size_t
的typedef
,具有更强的含义:它表示大小,以字节为单位。
也就是说,更容易知道变量的含义。当然,按照这个原理,不同的单位可能有很多不同的类型。但是"缓冲区大小"确实是一种常见情况,因此它以某种方式值得使用专用类型。
另一个方面是代码可维护性:例如,如果容器突然将其size_type
从uint64_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.,
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 将模板化的类型与C++中的某些类/类型进行比较
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- 包含的类类型显然没有声明,为什么?
- 错误:请求非类类型为"MULTIMEDIA_FILME [500]"的成员|
- 在 C++ 中输出枚举类类型的向量元素
- 引用不完整的类类型 - C++
- 如何允许模板参数中的类类型,仅当它有两个基类时
- 如何使用 std::make_shared 创建基类类型的智能指针?
- C++如果采用类类型的函数被传递派生类型,有没有办法给出错误?
- 表达式必须具有类类型 vs.
- C2011: 'Card':"类"类型重新定义(尽管使用了包含保护并且没有在文件中重新定义.cpp类)
- 创建类类型的动态分配数组,其中类不得具有默认构造函数
- 为什么允许dynamic_cast到非唯一的基类类型?
- E0322:不允许使用抽象类类型 " " 的对象
- 非类类型表达式的静态类型与动态类型之间的差异
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- C++ 模板类/类型,可在最大值和最小值之间进行选择
- Qt:如何为所有小部件和小部件类型实现通用基类信号/插槽功能(通过虚拟基类插槽)