cof*_*low 16 c++ types vector std
我认为这是一个非常基本的问题,但我无法弄明白.
我习惯于在C++中使用数组,但我现在开始学习矢量.我正在制作一个测试代码,我遇到了一个问题.
首先,这是我制作的代码:
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
int main(){
vector<double> score(10);
for(vector<double>::size_type i=0;i<20;i++) {
cout<<"Enter marks for student #"<<i+1<<":"<<flush;
cin>>score[i];
}
double total = accumulate(score.begin(), score.end(),0);
cout<<"Total score:"<<total<<endl<<"Average score:"<<total/score.size()<<flush;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在for
第9行的句子中,我宣称i
是一种vector<double>::size_type
类型(因为我被告知要这样做).我测试了上面用上面所说的类型取代的代码int
,它工作得非常好.为什么比较vector<double>::size_type
优先int
?
Mik*_*our 25
size_type
保证足够大,以支持最大的矢量大小,vector::max_size()
.int
不是:在许多常见平台上,int
有32位,而max_size()
远大于2 31.
如果你知道大小是(并且将永远是)一个像20这样的小数字,那么你可以使用int
或任何其他整数类型而不是size_type
.如果您要更改程序,例如从输入中读取大小,那么如果该值大于INT_MAX
; 则会出现严重错误; 在使用时size_type
,它会继续工作以达到max_size()
您可以轻松测试的任何值.
嵌入类型vector<double>::size_type
涉及各种vector
方法的返回值,例如.size()
,因此在这种情况下优先使用匹配类型(int = 0
通常会导致符号不匹配警告).例如
for (vector<double>::size_type i = 0; i < score.size(); ++i) { // types match
// ...
}
for (int i = 0; i < score.size(); ++i) { // types mismatch
// ...
}
Run Code Online (Sandbox Code Playgroud)
std::vector::size_type
在这种情况下,要求足够大以表示容器中可包含的最大元素数vector<double>::max_size()
.一般来说,它映射到size_t
.
在你的情况下,没有明确的理由使用vector<double>::size_type
(虽然它在技术上会更好用size_type
),因为循环从0到20运行,两者都是int
.因此以下是可以的.
for (int i = 0; i < 20; ++i) { // loops 20 times
// ...
}
Run Code Online (Sandbox Code Playgroud)
补充说明:
支持基于索引的基于迭代器的循环:
for (vector<double>::iterator i = score.begin(); i != score.end(); ++i) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
它没有被标记为C++ 11,但如果可能的话,基于for循环的范围会处理很多这样的事情.
for (double& i : score) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
甚至使用for_each
带有lambda的.
归档时间: |
|
查看次数: |
2452 次 |
最近记录: |