【问题标题】:Initializing a Vector (C++)初始化向量 (C++)
【发布时间】:2015-05-31 11:09:22
【问题描述】:

我一直在尝试创建一个函数,将数字输入向量(准确地说是 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];
}

我明白了

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

我是编程新手,可能无法理解复杂的答案。 如果以前有人问过这个问题,我深表歉意。我使用 Linux Ubuntu 编译我的代码(终端,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&lt;double&gt;(sum)/(N);

【问题讨论】:

  • 所以你有一个问题陈述,你的讲师提供了一个正确的解决方案。你的问题到底是什么?
  • 他的回答让我很困惑。

标签: c++ vector


【解决方案1】:

你真的应该拿起你的课本,开始阅读,最好是昨天。不过,我将分别讨论每个部分。

您的代码(略有更改)

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&lt;double&gt; 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&lt;7; j++)(缺少=)。 a 应该是第一次尝试时的 vector&lt;double&gt;,而不是函数参数。

你的讲师代码有一行

double average (const vector<int>& v)

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

最后,static_cast&lt;double&gt; 是一种将变量类型从int 转换为double 的形式。原因是3/2 == 13.0/2 == 1.5

【讨论】:

    【解决方案2】:

    const vector&lt;int&gt;&amp; 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&lt;double&gt;(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。

    【讨论】:

      【解决方案3】:

      代码中编译器出错的原因

      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]
      

      【讨论】:

        【解决方案4】:

        我是一个等级初学者,但刚刚从那些长期的“为什么以所有好的和油腻的名义不起作用”的时刻中出现,试图将整数输入到定义的最大大小的向量中,我提供此说明。我的错误是在定义向量的最大大小时——vector numbs(25)——我无意中使用了括号而不是括号——即 vector 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;
        }
        

        【讨论】:

          猜你喜欢
          • 2012-06-21
          • 2013-05-10
          • 1970-01-01
          • 2018-09-30
          • 1970-01-01
          • 2012-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多