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 次 |
| 最近记录: |