codecamp

C++ 一次遍历的方案

虽然上面的函数可以完成指定工作,但是它的效率比较低。每一次调用howMany函数时它都要将整个数据内容遍历一次。在下面的程序中,我们需要将数据遍历十次。

我们要设计一个函数,使其将数据遍历一边就能完成工作。对数据中的每一个值,我们可以将其对应的计数存储点找出,并将其自增一。换句话说,我们使用向量中的值作为直方图的下标。下面是对应方法设计的程序:

apvector<int> histogram (upperBound, 0);

for (int i = 0; i<numValues; i++) {
    int index = vector[i];
    histogram[index]++;
}

第一行对统计值进行初始化直方图的值为0。通过这样,我们就可以在循环体里通过++操作符进行对直方图增长。我们知道我们让它会从0开始。而忘记初始化计数器是一个常见的错误。

作为一练习,可以将以上的代码封装设计好,组合成一histogram函数,输入一个向量并统计值范围(这里是0到10),返回值就是向量中的统计直方图。

C++ 直方图
C++ 随机种子
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }