Bootstrap

C++中vector数组的求平均值函数average()定义问题

#include <iostream>
#include<vector>
#include<stdio.h>
using namespace std;

double average(double *arr){
    int len = (*arr).size;
    int sum = 0;
    int i;
    for ( i = 0;i < len; i++){
        sum += i;
    }
    
    return sum / len;
}

int main() {
    unsigned n;
    cout<<"n = ";
    cin>>n;
    
    vector<double> arr(n);
    cout<<"Please input"<<n<<"real numbers:"<<endl;
    for ( unsigned i = 0; i < n; i++)
        cin>>arr[i];
    
    cout<<"Average = "<< average(arr)<<endl;
    return 0;
}

以上这个失败的代码

double中int len的报错:Member reference base type 'double' is not a structure or union

main中coutAverage中对average()的报错:No matching function for call to 'average'

main是抄的视频里的,average是视频里抄完但没有average定义然后去百度抄的但不是数组输入而是输入*x和len的,然后自己改的输入vector数组的

但很显然没改对

我现在根本就不了解vector怎么用

下面这个是视频的代码

我再去看看vecotr的用法,以及average是要自己写的话怎么写,还是要导入什么库...

(1分钟后)

原来视频离我暂停的地方后面马上就讲average函数了...

average()函数这里确实只是接受了一个对象引用(arr),不知道这里面的元素个数

但是在函数内for循环需要时可以调用arr的函数" .size() "

这个" .size() "是vector对象的函数,返回函数个数来控制循环

正确的定义average()及完整代码如下

//计算数组arr中元素的平均值
double average(const vector<double> &arr)
{
    double sum = 0;
    for (unsigned i = 0; i < arr.size(); i++)
        sum += arr[i];
    return sum / arr.size();
}

int main() {
    unsigned n;
    cout<<"n = ";
    cin>>n;
    
    vector<double> arr(n);
    cout<<"Please input"<<n<<"real numbers:"<<endl;
    for ( unsigned i = 0; i < n; i++)
        cin>>arr[i];
    
    cout<<"Average = "<< average(arr)<<endl;
    return 0;
}

然后视频讲了个我没完全看懂的功能

代码如下

//基于范围的for循环配合auto举例
#include <vector>
#include <iostream>
int main()
{
    std::vector<int> v = {1,2,3};
    for (auto i = v.begin();i != v.end(); ++i)
        std::cout<<*i<<std::endl;
    
    for (auto e : v)//每次循环e都会从v中取出一个数组元素来进行处理,
        std::cout<<e<<std::endl;
}

这个 " e : v " 的用法我是第一次见,说是可以每次循环时候,e 都会从 v 中取出一个数组元素来进行处理

所以第一个for里的*i的作用是什么呢?为什么指针感觉用的随随便便看不到用处?

i = v.begin();i != v.end() 这个我看懂了,挺巧妙的,这个.begin()和.end()也都是vector数组的功能

用auto确实很方便,因为不知道从vector数组中去取出来的可能是什么数

我想出来了为什么要用i的指针了

因为i是在for循环的第一个初始化中当场定义的

i = v.begin()按我的观察,这个v.begin()返回的是一个地址

是vector数组v第一个元素的地址

然后后面v.end()是vector数组v最后一个元素的地址

因为i都是vector数组v中元素的地址,故要输出数组元素的话,要用*i,取的是在i这个地址的元素的值

没毛病!

;