欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自然数映射与下标

程序员文章站 2022-05-13 20:53:21
...

在物理实现上,向量/数组是一段连续的内存空间。但向量/数组不仅仅是连续存储元素的集合,它亦是一个映射(mapping),可从{0,1,…n-1}映射到元素类型均为T的集合上,这种审视和处理的观点显然更高。
例:设学生成绩已存于vector< int>型向量scores中,其值范围从0到100,试统计以10为间隔各分数段学生数目。
解1:最容易想到的是写if/else if或者switch语句来解决问题。假设将各分数段的人数存入向量nums中,程序可写为:

vector<int> Nums(10,0);
for(size_t i=0;i<scores.size();i++)
	If(scores[i]<10)
		Nums[0]++;
	else If(scores[i]<20)
		Nums[1]++;
	else If(scores[i]<30)
		Nums[2]++;
	else If(scores[i]<40)
		Nums[3]++;
	else If(scores[i]<50)
		Nums[4]++;
	else If(scores[i]<60)
		Nums[5]++;
	else If(scores[i]<70)
		Nums[6]++;
	else If(scores[i]<80)
		Nums[7]++;
	else If(scores[i]<90)
		Nums[8]++;
	else
		Nums[9]++;

显然这是个拙劣的程序思路,如果分数分布均匀的话,scores中平均每个成绩需要做大约5次判断。
解2:
考虑到向量在这里的功效,不妨直接利用下标之间建立映射

vector<int> Nums(11,0);
for(size_t i=0;i<scores.size();i++)
	Nums[scores[i]/10]++;
Nums[9] += nums[10];
相关标签: 映射