向量和函数练习

Vectors and Functions exercise

我有一个关于这个程序的问题。我是编程和 C++ 的初学者,我想弄清楚两件事。

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

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

/* 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;
}

您的代码中有错误 -

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

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


could someone explain how the function outside of main (sumUpTo) works? Specifically '& vec' and 'total'

sumUpTo 声明为 - int sumUpTo(const std::vector<int>& vec, const std::size_t total).

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

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

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

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