C++:"vector <int> :: size_type variable" - 以这种方式声明的重点是什么?

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()您可以轻松测试的任何值.

  • @ Manu343726:标准不保证`size_type`将是`std :: size_t`.但在实践中,它始终是.因此,是否使用`std :: size_t`或`size_type`取决于您希望在标准合规性方面的"纯粹"程度.我个人认为`std :: vector <double> :: size_type`太长了. (5认同)
  • 是否有任何特定的理由不使用`std :: size_t`,即`std :: vector`的`size_type`不仅仅是`std :: size_t`的别名?我总是使用`std :: size_t`来表示数组/向量/索引和大小表示,因为它应该是标准/可移植类型. (2认同)

Nia*_*all 7

嵌入类型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的.