【问题标题】:Vectors and Functions exercise向量和函数练习
【发布时间】:2020-08-08 19:13:43
【问题描述】:

我有一个关于这个程序的问题。在编程和 c++ 方面,我是初学者,我正在尝试弄清楚两件事。

  1. 为什么这个程序没有编译(错误:使用未初始化的内存'total' - 我把它定义为一个变量??)。

  2. 有人能解释一下 main (sumUpTo) 之外的函数是如何工作的吗?特别是& vec 和total,因为我以前从未见过它们。谢谢。

/* 1) read in numbers from user input, into vector    -DONE
    2) Include a prompt for user to choose to stop inputting numbers - DONE
    3) ask user how many nums they want to sum from vector -
    4) print the sum of the first (e.g. 3 if user chooses) elements in vector.*/

#include <iostream>
#include <string>
#include <vector>
#include <numeric> //for accumulate

int sumUpTo(const std::vector<int>& vec, const std::size_t total)
{
    if (total > vec.size())
        return std::accumulate(vec.begin(), vec.end(), 0);

    return std::accumulate(vec.begin(), vec.begin() + total, 0);
}

int main()
{

    std::vector<int> nums;
    int userInput, n, total;

    std::cout << "Please enter some numbers (press '|' to stop input) " << std::endl;
    while (std::cin >> userInput) {

        if (userInput == '|') {
            break; //stops the loop if the input is |.
        }

        nums.push_back(userInput); //push back userInput into nums vector.
    }

    std::cout << "How many numbers do you want to sum from the vector (the numbers you inputted) ? " << std::endl;
    std::cout << sumUpTo(nums, total);

    return 0;
}

【问题讨论】:

  • 您已经声明了total,并且您正在使用它,但您从未赋予它任何特定的价值。然后,您的程序会通过访问未初始化的对象来表现出未定义的行为。
  • sumUpTo 你不清楚吗?您似乎在说您以前从未见过带参数的函数。你最喜欢的 C++ 教科书肯定包含这样的例子。
  • @IgorTandetnik 我已经看到他们采用了参数,但不是这样处理我认为是 & 的指针。并且尚未讨论 main 之外的调用函数,因此我的问题是先生。
  • &amp; 这里表示引用,而不是指针。你最喜欢的 C++ 教科书应该有一节关于通过引用传递参数。还有一个关于定义和调用函数的部分。
  • 是的,我相信确实如此,但是这本书是为完全的初学者准备的,我认为他试图强迫我们使用简单的编码技能(简单的函数等),不过我会研究一下,谢谢你。

标签: c++ stdvector c++-standard-library


【解决方案1】:

代码中的错误 -

  • int userInput, n, total;
    .
    .
    .
     std::cout << sumUpTo(nums, total);
    

    在这里您声明total 并直接将其用作sumUpTo 函数的参数。在该函数中,您在比较中使用它(if (total &gt; vec.size()))。但是,由于您在声明时从未对其进行初始化,也没有在代码中的任何位置为其分配任何值,因此编译器不知道如何处理您正在进行的比较,因为total 没有任何价值。


有人能解释一下 main (sumUpTo) 之外的函数如何吗? 作品?特别是'& vec'和'total'

sumUpTo 的声明为 - int sumUpTo(const std::vector&lt;int&gt;&amp; vec, const std::size_t total)。

在这里,您期望该函数将整数向量作为参数。但是您可能对 vec 之前的 &amp; 有疑问。该符号只是指定您要去pass the vector as a reference,而不是通过制作向量的完整副本。在我们的常规传递中,我们传递给函数的向量将作为原始向量的副本传递。但在这种情况下,向量是作为参考而不是原始向量的副本传递的。

请注意,我使用了术语reference而不是指针。如果您来自 C 背景,您可能会觉得两者是相同的,并且在某些情况下,它们的功能可能有点相似但几乎没有区别(一些关于 SO 的好答案 - 1,@ 987654323@, 3 )在它们之间,您可以阅读许多在线可用的好资源。请理解,在这种情况下,它会阻止在将向量传递给函数时对其进行复制。如果函数声明没有提到该参数为const,您还可以在向量中进行更改,这也将反映在原始向量中(而如果您正常传递它而不是作为参考)。

std::size_t 是一种用于表示对象大小(以字节为单位)的类型。它是一种无符号数据类型,在处理对象大小时使用。如果您不确定std::size_t 和int 之间的区别(这可能是您所期望的),您也可以参考this。

最后,很明显const 在函数中被使用以确保我们传递给函数的参数不会在函数中被修改。

【讨论】:

  • 谢谢!既然你解释了,就很简单了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
相关资源
最近更新 更多