如何从函数编辑对象的数据?

时间:2017-11-06 18:02:40

标签: c++ function vector

如果这个问题已经得到解答,我很抱歉(我试着四处寻找,但找不到相同的东西,类似的问题&解决方案并没有起作用),但我怎么办?一个对象(在这种情况下,是一个对象的向量)并让函数编辑这些值而不返回任何东西?

示例:

void incVector(std::vector<int> vec)
{
    for (auto l = 0; l < int(vec.size()); l++)
    {
        vec[l]++;
    }
}

int main()
{
    std::vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    for (auto l = 0; l < int(vec.size()); l++)
    {
        std::cout << vec[l];    //Output: "12"
    }

    incVector(vec);

    for (auto l = 0; l < int(vec.size()); l++)
    {
        std::cout << vec[l];    //Output: "12"
        //This output should be "23"
    }
}

显然,我实际使用它的内容要复杂得多,但这足以说明我尝试做的事情。在实际项目中,它是一个具有不同功能的兔子洞,其中一些返回东西而另一些则没有,所以让它简单地返回矢量不是一个选项。

我试过让incVector接受对向量的引用,向量的指针,对向量的引用的指针,以及指向向量的指针(这些解决方案似乎适用于其他类似的问题)但这些都不适合我。

编辑: 天啊,我觉得自己很蠢。我发誓我之前尝试使用过参考资料而且它没有用。然而现在,尝试它再次正常。抱歉! ^^;

2 个答案:

答案 0 :(得分:3)

您按值传递向量,因此修改纯粹是本地的: 将您的函数原型更改为:

void incVector(std::vector<int> &vec)

通过引用传递并从主修改后的

获取

答案 1 :(得分:3)

参考参数。您也可以使用现代的for循环。

void incVector(std::vector<int>& vec)
{
    for (auto& l : vec)
    {
        ++l;
    }
}

但你实际上并不需要这样做。可以使用标准算法(std::for_each)和引用向量元素的lambda函数轻松地对向量的每个元素应用操作:

#include <algorithm>
// ...

std::for_each(vec.begin(), vec.end(), [](int& l){ ++l; });

for_each将为向量中的每个元素调用lambda并将其作为参数传递。由于您通过引用(int&)获取参数,因此递增它将增加向量中包含的实际元素。

然而,要取消这一点的关键点是,当您想要为已存在的对象指定新名称时,请使用引用。这些在标识符之前用&声明:

int i = 0;
int &i_ref = i;

此处,i_ref是对i的引用,这意味着它只是i的另一个名称。修改i_ref与修改i相同。

这同样适用于函数参数。如果函数参数是引用,则意味着它是传递给函数的对象的另一个名称。修改引用与修改传递给函数的对象相同。