如果这个问题已经得到解答,我很抱歉(我试着四处寻找,但找不到相同的东西,类似的问题&解决方案并没有起作用),但我怎么办?一个对象(在这种情况下,是一个对象的向量)并让函数编辑这些值而不返回任何东西?
示例:
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接受对向量的引用,向量的指针,对向量的引用的指针,以及指向向量的指针(这些解决方案似乎适用于其他类似的问题)但这些都不适合我。
编辑: 天啊,我觉得自己很蠢。我发誓我之前尝试使用过参考资料而且它没有用。然而现在,尝试它再次正常。抱歉! ^^;
答案 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
相同。
这同样适用于函数参数。如果函数参数是引用,则意味着它是传递给函数的对象的另一个名称。修改引用与修改传递给函数的对象相同。