修改向量的元素(按值、按引用) 函数C++
Modify elements of vector (by value, by reference) Function C++
我有一个函数,我必须修改向量的值。返回向量在C++中是一种好的做法吗?
功能1:
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;
}
功能2:
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
}
这两个函数用于两个不同的目的。
-
功能1:作为
remove_copy
工作。它不会修改现有容器;它制作一个副本并对其进行修改。 -
功能2:作为
remove
工作。它将修改现有容器。
有点主观。我个人更喜欢后者,因为它不会将复制向量的成本强加给调用者(但如果调用者愿意,他们仍然可以自由地进行复制)。
在这种特殊情况下,我会选择通过引用传递,但不是因为这是一种C++的做法,而是因为它实际上更有意义(函数的名称对向量应用修改)。似乎没有实际需要从函数返回数据。
但这也取决于函数的目的。如果您始终想通过以下方式使用它:
vec = bow.RemoveSpecialCharacters(vec);
那么绝对是第一个选择。否则,第二个似乎更合适。(从函数名称来看,第一个在我看来更合适)。
在性能方面,现代 C++11 世界中的第一个解决方案将是更少,任务速度慢一些,因此性能影响可以忽略不计。
转到选项 2,修改作为参数传递的向量。
旁注:一些编码实践建议传递可能被更改的指针参数(只是为了让开发人员一目了然地知道该函数可能会更改参数)。
最佳做法是通过引用向量来传递。
在函数中,您可以对其进行编辑,而不必将其返回(实际上您正在分配不需要的新内存空间)。
如果通过引用传递它,则成本要小得多,并且向量也会在函数范围之外进行编辑
第一个函数将返回向量的副本,因此它将比第二个函数慢。您应该使用第二个。
这两种做法都不是C++的好做法,如果说的好做法是指在C++库中是如何完成的。你基本上重新实现了std::remove_copy_if
或std::remove_if
所做的事情,所以好的做法是实现函数(或使用现有的函数),这些函数通过值或引用来处理范围,而不是容器。
同样,这取决于您如何定义术语good practice
。
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 无法将右值引用函数与 GCC 匹配
- C ++引用函数参数似乎包含原始对象的副本,而不是充当"real reference"
- 通过引用函数传递指针参数是什么意思?
- 常量引用函数参数的地址何时唯一?
- 我想了解为什么在这个例子中使用引用函数?或者引用在c++函数中的重要性
- C++ 通过引用函数传递数组,但内容保持不变
- 用数组或指针引用函数?
- 引用函数如何"int &foo();"工作?
- 常量引用函数参数:是否可以禁止临时对象?
- 计算在代码中引用函数的次数
- <initializer_list> 引用函数
- 字符串引用(函数)的差异
- 在类中引用函数时的"No Matching Function for Call"
- 无法通过引用函数"calcValues"中"firstNum"和"secondNum"变量来更改值
- 尝试引用已删除的函数(不引用函数)
- 引用函数指针
- 引用函数按值和自动返回
- 为什么我们可以取消引用函数指针
- 通过引用函数传递值的目的是什么