初始化向量(C ++)

时间:2015-05-31 11:09:22

标签: c++ vector

我一直在尝试创建一个将数字输入向量(确切地说是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'之前预期的primary-expression

当我将其更改为

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

我得到了

  

数组下标的无效类型'int [size_t {aka unsigned int}]'      CIN&GT;&gt;一种[J];

我是编程新手,可能无法理解复杂的答案。 如果以前曾问过这个问题,我会道歉。我使用Linux Ubuntu编译我的代码(Terminal,g ++)。

N.B。我们讲师的答案是:

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);

4 个答案:

答案 0 :(得分:5)

你真的应该拿起你的教科书,并开始阅读,最好是昨天。不过,我将分别针对每个部分进行讨论。

您的代码(略有变化)

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;单词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>,而不是函数参数。

您的讲师代码有

double average (const vector<int>& v)

&之前的v告诉函数它没有收到变量v的副本(按值),而是接收原始副本(通过引用)。通常,这意味着如果函数更改其值,则更改调用函数副本。然而,在这里,有一个神奇的词const不允许函数改变值。

最后,static_cast<double>是将变量类型从int转换(更改)为double的形式。原因是3/2 == 13.0/2 == 1.5

答案 1 :(得分:0)

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

for部分是for循环,它从0循环到v.size()-1,即C ++中的数组索引从0开始,因此对向量进行索引。因此第一个元素是v [0],所以......

sum = sum + v[i] - &gt;这将执行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。

答案 2 :(得分:0)

代码中编译器出错的原因

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

每个作业中都存在int关键字。删除它们。

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

因此,在尝试分配其元素之前,需要调整矢量大小。

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()

答案 3 :(得分:0)

我是一名初学者,但刚刚从其中一位长期出现的人中脱颖而出,为什么以所有优秀和油腻的名义出现这项工作&#34;试图将整数输入到定义的最大大小的向量中的时刻,我提供了这个注释。我的错误在于定义我的向量的最大大小 - 向量麻木(25) - 我无意中使用了括号而不是parens - 即,向量麻木[25] - 在获得最令人困惑的失败时产生了不愉快的影响输入阶段 - 即cin&gt;&gt;麻木[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;
}