我有一个功能,我必须修改矢量的值。 在C ++中返回向量是一种很好的做法吗?
vector<string> RemoveSpecialCharacters(vector<string> words)
{
for (vector<string>::iterator it=words.begin(); it!=words.end(); )
{
if(CheckLength(*it) == false)
{
it = words.erase(it);
}
else{
++it;
}
}//end for
return words;
}
void RemoveSpecialCharacters(vector<string> & words)
{
for (vector<string>::iterator it=words.begin(); it!=words.end(); )
{
if(CheckLength(*it) == false)
{
it = words.erase(it);
}
else{
++it;
}
}//end for
}
答案 0 :(得分:6)
您的两个功能有两个不同的用途。
功能1:作为remove_copy
使用。它将不修改现有容器;它会复制并修改它。
功能2:作为remove
使用。它将修改现有容器。
答案 1 :(得分:3)
这有点主观。我个人更喜欢后者,因为它没有强制将矢量复制到调用者的成本(但是如果他们选择的话,调用者仍然可以自由地制作副本)。
答案 2 :(得分:2)
在这种特殊情况下,我选择通过引用传递,但不是因为它是一个C ++实践,而是因为它实际上更有意义(函数的名称将修改应用于向量)。似乎没有实际的需要来从函数返回数据。
但这也取决于功能的目的。如果总是想要以下列方式使用它:
vec = bow.RemoveSpecialCharacters(vec);
然后绝对第一个选择是去。否则,第二个似乎更合适。 (根据功能名称判断,第一个似乎给我更合适。)
在性能方面,现代C ++ 11世界中的第一个解决方案将更少一些分配速度更慢,因此性能影响可以忽略不计。
答案 3 :(得分:1)
转到选项2 ,修改作为参数传递的向量。
旁注:一些编码实践建议传递可能被更改的指针参数(只是为了让开发人员首先明白该函数可能会改变参数)。
答案 4 :(得分:1)
最佳做法是通过引用传递向量。
在编辑它的函数内部,您不必将其返回(事实上,您正在分配一个不需要的新内存空间)。
如果您通过引用传递它,则成本会小得多,并且矢量也会在函数范围之外进行编辑
答案 5 :(得分:0)
第一个函数将返回向量的副本,因此它将慢于第二个。你应该使用第二个。
答案 6 :(得分:0)
实际上,对于C ++来说,没有一个是好的做法,如果通过良好的实践来表示它是如何在C ++库中完成的。您基本上重新实现了std::remove_copy_if
或std::remove_if
所做的事情,因此良好的做法是实现函数(或使用现有函数),这些函数适用于范围,而不是容器,无论是通过值还是通过引用。
这又取决于您如何定义术语good practice
。