我的背景主要是R,SAS和VBA,我试图学习一些C ++。我已经选择了#34;加速C ++" (Koenig,Moo)是我关于这个主题的第一本书。我的理论背景。 SCI。诚然,这不是最强大的,这或许可以解释为什么我对这些观点感到困惑。
我对一段类似于以下内容的代码有疑问:
#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;
}
据我了解,vector_size
已足够大了#34;保持example_vector
的大小,无论example_vector
多大。我不确定我理解这意味着什么:vector_size
(在这种情况下)是否能够表示大于long long x;
的整数,以便std::cout << vector_size;
打印出来与std::cout << x;
不同的价值?如何/为什么?
答案 0 :(得分:3)
这个问题归结为标准不强制vector<T>::size()
方法返回的实际类型。不同的实现可以做出不同的选择
因此,如果您希望将对size()
的调用返回的值赋给变量,那么您应该为该变量使用什么类型?为了编写可跨不同实现移植的代码,您需要一种方法来命名该类型,并认识到标准库的不同实现可能使用不同类型的事实。
答案是vector<T>
提供了您应该使用的类型。它是
vector<T>::size_type
您需要了解并习惯使用C ++的一件事是标准确实需要满足不同实现之间的重大差异。
答案 1 :(得分:0)
std::vector<T>::size_type
正是标准所暗示的,即您的实现当前用于允许存储大小的类型。
历史上,架构已发生变化,需要代码解析器,重新测试以及其他基本的时间浪费。遵循这些标准,您的代码现在和将来都可以在任何兼容的平台上运行。
因此,您的代码可以在支持16bit架构和理论上256bit架构的情况下工作。
因此,如果您更改平台,您很可能只会将其视为size_t
,您不必担心。更重要的是,无论谁维护你的代码都不需要。
答案 2 :(得分:-1)
在vector类(以及许多其他类)中,它们有一个typedef:
typedef **implementation_defined** size_type;
“size_type”可能使用size_t也可能不使用size_t。 也就是说,size_t总是足以覆盖你所有的内存(可能是32位或64位)。请注意,size_t可能总是足够大以覆盖你的所有内存(在至少只要你在桌面计算机上编程,但这不能保证。
此外,要知道变量的大小,以及它可以容纳多少,你可以使用sizeof。
因此,这将为您提供size_type类型的实际大小:
std::cout << sizeof(std::vector<double>::size_type) << std::endl;
根据您的处理器和编译器,将是4或8。最大尺寸定义为2×8的功率(即2功率32或2功率64。)