向量<;双重>;::尺寸、类型与备选方案 我的背景主要是R,SAS和VBA,我正在努力学习一些C++。我选择了《加速C++》(Koenig,Moo)作为我关于这个主题的第一本书。我在comp的理论背景。sci。不可否认,它不是最健壮的,这也许可以解释为什么我对这些观点感到困惑

向量<;双重>;::尺寸、类型与备选方案 我的背景主要是R,SAS和VBA,我正在努力学习一些C++。我选择了《加速C++》(Koenig,Moo)作为我关于这个主题的第一本书。我在comp的理论背景。sci。不可否认,它不是最健壮的,这也许可以解释为什么我对这些观点感到困惑,c++,C++,我有一个关于类似以下代码的问题: #include <iostream> #include <vector> int main() { double input; std::vector<double> example_vector; while (std::cin >> input) { example_vector.push_back(input); } std::vector<doub

我有一个关于类似以下代码的问题:

#include <iostream>
#include <vector>

int main() {

   double input;
   std::vector<double> example_vector;

   while (std::cin >> input) {
      example_vector.push_back(input);
   } 

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

   return 0;
}
#包括
#包括
int main(){
双输入;
std::vector示例_vector;
while(标准::cin>>输入){
示例向量。推回(输入);
} 
标准::向量::大小\类型向量\大小;
vector_size=示例_vector.size();
返回0;
}

据我所知,
vector\u size
是“足够大”的,可以容纳
example\u vector
的大小,无论
example\u vector
有多大。我不确定我是否理解这意味着什么:
vector\u size
(在本例中)是否能够表示大于(比如)长x的整数,所以这个问题归结起来是标准没有规定向量::size()方法返回的实际类型。不同的实现可能会做出不同的选择

因此,如果希望将调用
size()
返回的值分配给变量,那么该变量应该使用什么类型?为了编写可跨不同实现移植的代码,您需要一种命名该类型的方法,认识到标准库的不同实现可能使用不同的类型

答案是
vector
提供了您应该使用的类型。是的

vector<T>::size_type
vector::size\u类型
<> P>一个你需要理解并习惯于C++的东西是,标准需要迎合不同实现之间的显著差异。p> 在vector类(以及许多其他类)中,它们有一个typedef:

typedef **implementation_defined** size_type;
“尺寸类型”可以使用尺寸,也可以不使用尺寸。也就是说,大小总是足够大,足以覆盖所有内存(32位或64位)。请注意,大小可能总是足够大,足以覆盖所有内存(至少只要您在桌面计算机上编程),但这并不能保证

此外,要知道变量的大小,以及它可以容纳的量,可以使用sizeof

因此,这将为您提供size_类型的实际大小:

std::cout << sizeof(std::vector<double>::size_type) << std::endl;
std::cout
std::vector::size_type
正是该标准所暗示的类型,您的实现当前使用的允许存储大小的类型

从历史上看,体系结构已经发生了变化,需要代码解析器、重新测试和其他基本的时间浪费。通过遵循这些标准,您的代码现在和将来都可以在任何complient平台上工作

因此,您的代码可以在16位架构和理论上支持的256位架构上工作


因此,如果你改变了平台,你很可能只会把它看作是
size\t
,但你不必担心。更重要的是,维护您的代码的人也不必这样做。

如果您可以使用C++11功能,您可以依靠
auto
auto vector\u size=example\u vector.size()。我认为在大多数实现中,
vector::size_type
不太可能与
std::size_t
有所不同,但由于不能保证,您可以使用typedef(“偏执模式”)。相关:“据我所知,vector_size“足够大”来容纳示例_向量的大小,无论示例_向量有多大”-那不是真的。退房
vector::max_size()
返回
数值限制::max()
,因此如果将
std::uint8\u t
用作
vector::size\u type
vector::max_size()
将是
256
-1。您的实现可能有这样一个typedef,但这并不意味着您将在每个实现中看到它。这里的标准非常明确:typedef是
typedef**implementation defined**size\u type
。换句话说,
std::vector::size\u type
是实现定义的。它不一定是std::size\u t
。我说他们有一个typedef,很可能是size\u t,但我没有说会是。实际上,我解释说,除非您使用sizeof()来确定类型的大小,否则您不会知道。您的前导句说“他们有一个typedef:
typedef size\u t size\t;
”,这句话对于只支持32768个或更少元素的向量的实现来说,没有回旋余地。将您的
size\u t
更改为实现定义,我将收回我的否决票。
size\u t总是足够大,可以覆盖所有内存
false,-1。@BillyONeal,您知道有哪些操作系统提供的大小太小吗?谢谢,这很有意义。那么,将其视为一种类型是否正确?同样意义上的
double
是一种类型?确实,size\u类型是一种类型