【问题标题】:Why does powerNumber() add a new number to the vector when I am inside the function but the number disappears once the function is executed?为什么当我在函数内部时 powerNumber() 会向向量添加一个新数字,但执行函数后数字会消失?
【发布时间】:2022-04-04 19:15:49
【问题描述】:

解决方案可能很简单,但我想不通。如何对向量进行永久性更改,而不仅仅是在函数内部生效的更改?我对其进行了调试,我可以看到“数字”已更新为我希望它具有的值,但它一执行就消失了。

using namespace std;
bool checkVal();
vector<int> getNumbers();
void setPowerball(vector<int> numbers);

int main()
{
    srand(time(0));
    vector<int> numbers = getNumbers();
    setPowerball(numbers);

    for (int i = 0; i < 5; i++)
    {
        cout << numbers[i];
        cout << " ";
    }
}

bool checkVal(vector<int> numbers, int size, int value)
{
    for (int i = 0; i < size; ++i)
    {
        if (numbers[i] == value)
        {
            return true;
        }
    }
    return false;
}

void setPowerball(vector<int> numbers)
{
    for (int i = 4; i < 5; i++)
    {
        int last = rand() % 26 + 1;
        if (checkVal(numbers, i, last))
        {
            i--;
        }
        else
        {
            numbers.push_back(last);
        }
    }
}

vector<int> getNumbers()
{
    vector<int> numbers;
    for (int i = 0; i < 4; i++)
    {
        int num = rand() % 69 + 1;
        if (checkVal(numbers, i, num))
        {
            i--;
        }
        else
        {
            numbers.push_back(num);
        }
    }

    sort(numbers.begin(), numbers.end());
    return numbers;
}

【问题讨论】:

  • 因为您正在传递numbers 向量的副本,因此仅对该副本进行更改。让函数取而代之的是引用。
  • 与您的主题行相反,您的代码中没有名为 powerNumber() 的函数。在任何情况下,如果一个函数修改了一个按值传递给它的参数,调用者将无法看到这些更改。按值传递意味着传递调用者提供的对象的副本,因此函数修改副本而不触及原始副本,并且该副本在函数返回时不再存在。您的所有函数都通过值传递其参数。
  • @Tanishq-Banyal 观点是,如果 OP 无法获得他们问题的细节,他们就不能期待一个好的答案。在软件(开发、代码等)中,大多数问题的原因在于小细节,在问题中弄错小细节会大大增加问题误导试图提供帮助的人的机会,并降低获得有用/相关答案的机会。

标签: c++


【解决方案1】:

您正在按值将参数传递给setPowerBall 函数。所以每当它被调用时,它都会得到它的私有 copy 向量,gets destructed at the end of function scope.

在这种情况下,您应该通过引用传递参数。

void setPowerball(vector<int>& numbers)
{
    // do stuff
}

要点:-

  1. 注意函数声明中的&。这意味着采取lvalue reference。
  2. 引用允许您修改原始变量而无需复制。
  3. 对于像 std::string 或 std::vector 这样的对象,传递引用也更便宜。但对于 int 或 float 等原始类型,按值传递更快。

注意:您也可以使用指针来做同样的事情,但建议使用引用并且更安全。经验法则是尽可能使用引用,必须使用指针

【讨论】:

    猜你喜欢
    • 2019-12-25
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    相关资源
    最近更新 更多