这些C ++语句的含义是什么typedef vector <double> :: size_type

时间:2016-08-14 01:11:05

标签: c++ vector

我是C ++的初学者,对这些陈述有疑问。

vector<double> vec1;
typedef vector<double>::size_type vec_size
vec_size size = vec1.size()

从问题来看, C++: "vector<int>::size_type variable" - what is the point of declaring in this way?,我了解size::type拥有最大可能的矢量大小。我很困惑 type size::type - 它是函数,变量等吗?

使用typedef vec_size相当于vector<double>::size_type。所以第三行变为

vector<double>::size_type size = vec1.size()

这对我来说非常困惑。什么是变量size类型

如果有人用简化语言发表评论,那将非常有用。

3 个答案:

答案 0 :(得分:3)

这里真的有两个问题:

  

以这种方式宣告的重点是什么

这是为了防止手指脱落。如果您需要反复引用此类型,则每次只需键入vec_size就更容易,而不是拼出vector<double>::size_type。每。和。每一个。时间。

使用typedef。你的手指会感谢你的。尤其是小小的手指,不需要经常按下 SHIFT 键。

更不用说它使得结果代码也更容易被人看到了。

现在,就第二个问题而言:

  

什么是可变大小的类型?

答案是:你不知道,你不应该在意。您唯一应该关心的是这种类型足以表示向量中的元素数量。这就是这种类型的定义。

可能是unsigned intunsigned long,甚至是unsigned long long。但不要担心。无论它是什么,它都足以表达你所拥有的最大可能矢量的大小,即使是最轻微的声明和使用的希望。这也意味着此类型也是表示向量中任何元素的索引的正确类型。因此,如果您需要保存向量中某个特定元素的索引,或者通过索引迭代向量中的值,则这是正确的类型。因为它足以表示向量的大小,所以它足以表示向量中任何特定值的索引。

当然,对于尺寸预计相当适中的矢量,按照今天的标准,使用普通int也可以。但是通过使用这种类型,你会吹嘘所有的朋友:看,我对C ++了解很多。我知道如何正确使用这种类型。

答案 1 :(得分:1)

  

这对我来说非常困惑。什么是变量size类型

您的问题自行回答:它是vector<double>::size_type类型的变量。请考虑以下事项:

struct type_name
{
  typedef int inner;
};

什么是type_name::inner?它是typedef存储在type_name类型中的::inner有C ++范围语法;它用于指代在其他名称中声明的名称。在此,我们在type_name类型中声明type_name::inner。所以它的全名是typedef

在所有其他方面,它与任何其他std::vector没有区别。

size_type被定义为在其中声明了一个名为vector的类型别名。究竟是什么类型的别名?标准没有说明这一点。

所述的是这种类型的含义。它是一个无符号整数类型,足以能够索引最大可能at中的任何元素。 operator[]size_type取值size; capacitysize_typevector的值。实际上,任何与其大小或索引元素相关的size_type成员都会使用typedef类型的值。

虽然赔率很高,但它会成为size_t的{​​{1}}。

答案 2 :(得分:0)

vec_size的类型为std::vector<double>::size_type。对于某些无符号整数类型,这通常是typedef,但实际类型是实现定义的。

换句话说,它在编译器及其出厂标准库(和头文件)之间有所不同。

它通常是std::size_t(或等同于它的东西),但允许它是不同的东西。 std::size_t的实际类型也是实现定义的 - 可能是unsignedunsigned longunsigned long longuint32_tuint_64_t。它可能是其他东西(例如,某些类类型提供了所需的操作)。

如果你想使用一些“更简单”类型(比如unsigned long)来处理大小,那么你可以。但是,您接受所选类型不支持向量的所有可能大小的风险 - 这可能意味着您的程序中难以追踪的错误。使用std::vector<double>::size_type可以保证与所有正确符合标准的编译器和标准库一起使用。