我想知道以下两个函数中的哪一个在时间和空间方面最有效。它们都检查堆栈中是否存在某个元素。第一个使用按值传递机制,而第二个使用pass-by-reference。我可能错了,但我认为pass-by-value机制隐式复制参数,而在pass-by-ref中我们明确地执行它。
第一版按值传递:
template<class T>
bool find (stack<T> source, T value)
{
while (!source.isEmpty() && source.top() != value)
source.pop();
if (!source.isEmpty())
return true;
return false;
}
第二版通过引用传递:
template<class T>
bool find (const stack<T> &source, T value)
{
stack<T> temp = source;
while (!temp.isEmpty() && temp.top() != value)
temp.pop();
if (!temp.isEmpty())
return true;
return false;
}
答案 0 :(得分:7)
如果您要在函数内部制作本地副本,请使用pass by value。它更简单,更简单通常是好的。
P.S。当您返回bool
结果时,通常不需要if
语句。
return !source.isEmpty();
答案 1 :(得分:1)
在这种情况下,通过值传递它肯定更好。正如马克所说,无论如何,你的传递参考版本都会制作副本。
在这种情况下,pass-by-value更好,因为您向编译器提供了更多信息,因此它可以进行更好的优化。您保证find
函数source
中的内容实际上只是属于find
的值。当您通过引用传递一些值时,编译器无法判断是否存在对同一实例的某些其他(非常量)引用,这可以在执行source
时修改find
。
(好吧,在这种情况下它可能是相同的,find
是非常简单的功能)。