void setVector(vector<string> aStringVec)
{
for(std::vector<string>:: iterator s = str1.vec.begin(); s != str1.vec.end(); ++s)
{
classVector.pushback(*s);
}
}
如果我执行classVector = aStringVec,classVector将指向指向aStringVec的第一个元素的指针,因为向量被认为是数组,并且可能会消失,因为它在堆栈上,对吧?
这是为类向量编写setter的正确方法,我可以在任何地方调用它吗?
答案 0 :(得分:2)
如果你真的想设置这个东西,那么最好的选择就是
void setVector(vector<string> aStringVec)
{
classVector.swap(aStringVec);
}
这可确保classVector
保存函数参数内容的副本。
您在代码中尝试执行的操作是向classVector
附加元素,同时产生整个输入向量的不必要副本。
答案 1 :(得分:1)
根本不需要循环来将元素附加到现有向量。使用vector::insert
。
void setVector(vector<string> const& aStringVec)
{
classVector.insert(classVector.end(), aStringVec.begin(), aStringVec.end());
}
我将函数参数更改为const&
。 const
因为你不打算在你的函数中修改输入向量,你应该通过引用而不是值来传递,以避免不必要的复制。
相反,如果你想将classVector
的内容替换为输入参数的内容,那么你的函数应该是
void setVector(vector<string> aStringVec)
{
classVector = std::move(aStringVec);
}
在这种情况下,您应该按值传递参数,因为您将在函数内移动它。