繁体   English   中英

初始化向量(C ++)

[英]Initializing a Vector (C++)

我一直在尝试创建一个将数字输入向量(准确地说是7)并计算平均值的函数。 但是,我尝试将每个矢量元素初始化为用户输入的数字。 例:

double average(int a, int b, int c, int d, int e, int f, int g)
vector<double>aa;
aa[0]=int a;
aa[1]=int b;
aa[2]=int c; etc.

但是当我这样做时,我得到了

错误:“ int”之前的预期主表达式

当我将其更改为

for(size_t j=0; j<=7; j++)
{
    cout<<"Enter item # " <<(j+1);
    cin>>a[j];
}

我懂了

数组下标cin >> a [j]的无效类型'int [size_t {aka unsigned int}]'

我是编程新手,可能不了解复杂的答案。 如果这个问题曾经被问过,我对此表示歉意。 我使用Linux Ubuntu编译我的代码(Terminal,g ++)。

注意我们的讲师对此的回答是:

double average (const vector<int>& v)
{
    int N = v.size();
    int sum = 0;
    for (int i = 0; i < N; i = i + 1)
    {
        sum = sum + v[i];
    }
    return static_cast<double>(sum)/(N); 
}

(我认为我的想法是错误的,因为他要求“按引用函数调用”,并且我创建了“按值调用”。我不知道他写了什么(特别是return static_cast<double>(sum)/(N);

您确实应该拿起教科书并开始阅读,最好是在昨天。 不过,我将分别针对每个部分。

您的代码(略有变化)

double average(int a, int b, int c, int d, int e, int f, int g)
{
    vector<double>aa;
    aa[0]=int a;
    aa[1]=int b;
    aa[2]=int c;
    // etc.
}

有一些问题。 您收到的错误是由于所有看起来像aa[0]=int a;的行引起aa[0]=int a; int一词不应该在那里。 如果删除它们,它应该会编译并在运行时崩溃,因为aa的大小仍为0。您可以预分配向量( vector<double> aa(7); )或使用aa.push_back(aa);

第二次尝试

for(size_t j=0; j<=7; j++)
{
    cout<<"Enter item # " <<(j+1);
    cin>>a[j];
}

对于初学者,第一行应为for(size_t j=0; j<7; j++) (缺少= )。 a应该是第一次尝试的vector<double> ,而不是function参数。

您的讲师代码行

double average (const vector<int>& v)

v之前的&告诉函数它没有接收到变量v的副本(按值),而是收到了原始副本(按引用)。 通常,这意味着如果函数更改其值,则调用函数的副本也会更改。 但是,这里有一个不可思议的词const ,它禁止函数更改值。

最后, static_cast<double>是一种将变量类型从int转换为double 其原因是3/2 == 13.0/2 == 1.5

const vector<int>& v >这表示通过const引用传递元素类型为int的向量,即您不能更改v (添加/删除/插入/调整大小)

for部分是for循环,从0循环到v.size()-1即C ++中的数组索引从0开始,向量的索引也是如此。 因此,第一个元素是v [0],依此类推...

sum = sum + v[i] ->这将对v的所有元素求和。

最后,您需要除以v中的元素数才能计算平均值。 但是,将int除以std::size_t不会得到带小数位的结果。 因此,您需要将值转换为double

因此static_cast<double>(sum)/(N)

至于初始化std::vector ,请使用如下代码:

std::vector<int> v ;
int temp = 0 ;
while(true) {
    std::cin >> temp ;
    if(temp == -1)
        break ;
    v.push_back(temp);
}

上面的代码将读取输入并将其插入向量,直到遇到-1。

代码中来自编译器的错误原因

vector<double>aa;
aa[0]=int a;
aa[1]=int b;
aa[2]=int c;

是每个分配中int关键字的存在。 删除它们。

编译器不会抱怨的另一个问题是,默认情况下会创建一个大小为0的向量。 下一个问题是vectoroperator[] (由表达式aa[0]调用等)不会根据需要神奇地调整矢量的大小。 如果索引无效,则行为未定义。

因此,有必要在尝试分配向量之前确定向量的大小。

vector<double>aa (some_integer_greater_than_2);
aa[0]=a;
aa[1]=b;
aa[2]=c;

要么

vector<double>aa;
aa.resize(some_integer_greater_than_2)
aa[0]=a;
aa[1]=b;
aa[2]=c;

如果您事先不知道向量的大小,请使用push_back() (它将元素添加到末尾,并根据需要调整大小)。

vector<double>aa;
aa.push_back(a);    //since initial size is zero, this (in effect) resizes and copies a to aa[0]
aa.push_back(b);    //since size is now 1, this (in effect) resizes and copies b to aa[1]
aa.push_back(c);    //since size is now 2, this (in effect) resizes and copies c to aa[1]

我是一个入门级别的初学者,但是刚刚从那些试图将整数输入到已定义的最大大小的向量中的长时间的“为什么以所有善良而油腻的名字行不通”的问题中脱颖而出, 。 我的错误是,在定义向量的最大大小时-向量numbs(25)-我无意中使用了括号而不是括号-即向量numbs [25]-产生了最令人困惑的失败的后果输入阶段-即cin >> numbs [i]。 这是主题代码:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int size, i;
    vector<int> numbs(25); //error was using brackets instead of parens
    cout << "Please enter the size of the vector you wish to create (<25)";      
    cin >> size; 
    cout << "Please enter " << size << " integers: ";
    for (i=0; i<size; i++)
        cin >> numbs[i];  // where the effect of the prior error showed up
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM