我是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
的类型?
如果有人用简化语言发表评论,那将非常有用。
答案 0 :(得分:3)
这里真的有两个问题:
以这种方式宣告的重点是什么
这是为了防止手指脱落。如果您需要反复引用此类型,则每次只需键入vec_size
就更容易,而不是拼出vector<double>::size_type
。每。和。每一个。时间。
使用typedef
。你的手指会感谢你的。尤其是小小的手指,不需要经常按下 SHIFT 键。
更不用说它使得结果代码也更容易被人看到了。
现在,就第二个问题而言:
什么是可变大小的类型?
答案是:你不知道,你不应该在意。您唯一应该关心的是这种类型足以表示向量中的元素数量。这就是这种类型的定义。
可能是unsigned int
,unsigned 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
; capacity
和size_type
取vector
的值。实际上,任何与其大小或索引元素相关的size_type
成员都会使用typedef
类型的值。
虽然赔率很高,但它会成为size_t
的{{1}}。
答案 2 :(得分:0)
vec_size
的类型为std::vector<double>::size_type
。对于某些无符号整数类型,这通常是typedef
,但实际类型是实现定义的。
换句话说,它在编译器及其出厂标准库(和头文件)之间有所不同。
它通常是std::size_t
(或等同于它的东西),但允许它是不同的东西。 std::size_t
的实际类型也是实现定义的 - 可能是unsigned
,unsigned long
,unsigned long long
,uint32_t
,uint_64_t
。它可能是其他东西(例如,某些类类型提供了所需的操作)。
如果你想使用一些“更简单”类型(比如unsigned long
)来处理大小,那么你可以。但是,您接受所选类型不支持向量的所有可能大小的风险 - 这可能意味着您的程序中难以追踪的错误。使用std::vector<double>::size_type
可以保证与所有正确符合标准的编译器和标准库一起使用。