2016-08-14 31 views
0

我是C++的初学者,对这些语句有疑问。这些C++语句的含义是什么typedef向量<double> :: size_type

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拥有最大的可能向量的大小。我很困惑什么类型size::type - 它是一个函数,变量等?使用typedefvec_size相当于vector<double>::size_type。所以第三行变成

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

这对我来说很混乱。什么是型号变量size

如果有人用简体中文进行评论,这将会非常有帮助。

+5

'size_type'是一个无符号整数类型。提供该typedef的全部意义在于,您不必知道实现使用的确切类型。这就是说,它很可能是'size_t'。 – Praetorian

+0

增加了Praetorian所说的Containers :: size_type。所有容器都有与size_t相关的size_type。它不只是矢量。它在处理算法和排序时很方便。看看有效的STL,相当不错的书 – TimLayne

回答

1

这对我来说很混乱。什么是型号变量size

你的问题本身就会回答:它是一个vector<double>::size_type类型的变量。考虑以下内容:

struct type_name 
{ 
    typedef int inner; 
}; 

什么是type_name::inner?这是一个typedef存储在类型type_name::有C++作用域语法;它用于引用在其他名称中声明的名称。在这里,我们在type_name类型中声明inner。所以它的全名是type_name::inner

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

std::vector被定义为在其中声明的类型别名被称为size_type。究竟是什么类型的别名?这不是标准中规定的。

什么陈述的是这种类型的含义。它是一个无符号整数类型,它足够大以便能够索引尽可能最大的任何元素vectoratoperator[]取值为size_type; sizecapacity取值为size_type。事实上,任何以任何方式与其大小或索引元素相关的成员都需要size_type类型的值。

虽然赔率很好,但它会是typedefsize_t

3

的是真的在这里两个问题:

是什么这样

这是从脱落你的手让你的手指声明的地步。如果您需要一次又一次地参考此类型,则每次只键入vec_size,而不是拼写出vector<double>::size_type更容易。每。和。每一个。时间。

使用typedef。你的手指会感谢你。特别是那个小指头,不需要经常碰到钥匙。

更不用说,它使得结果代码更容易在眼睛上。

现在,至于第二个问题:

什么是可变大小的类型?

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

它可能是unsigned intunsigned long或甚至unsigned long long。但别担心。不管它是什么,它都会足够大,可以表达最大可能矢量的大小,甚至可以宣称和使用最小的希望。这也意味着这种类型也是表示矢量中任何元素索引的正确类型。因此,如果您需要保存向量中某个特定元素的索引,或者通过它们的索引遍历向量中的值,则这是正确的类型。由于它足够大以表示矢量的大小,因此足以表示矢量中任何特定值的索引。

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

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可以保证与所有符合标准的编译器和标准库一起工作。

相关问题