我的家庭作业的一部分是实现通用链表。 到目前为止,我写了这个函数:
template<class T>
void List<T>::insert(const T& data)
{
List<T>::Node* newNode = new List<T>::Node(data);
newNode->next = nullptr;
if (head == nullptr)
{
head = newNode;
tail = newNode;
}
else
{
tail->next = newNode;
tail = newNode;
}
size++;
}
正如您所看到的,我通过引用获取数据,但我也可以按价值获取数据。 我的问题是什么方法更好,为什么?
答案 0 :(得分:4)
在C ++ 98/03中,您拥有的通常是正确的解决方案。在C ++ 11中,你可以保持不变,你也不会变得更糟。但如果您想提高效率,可以进行一些修改。有两种思想流派。最有效的解决方案需要一些代码重复。你需要两个功能。
template<class T>
void List<T>::insert(const T& data) // take a const reference
{
List<T>::Node* newNode = new List<T>::Node(data); // copy it in
...
template<class T>
void List<T>::insert(T&& data) // take an r-value reference
{
List<T>::Node* newNode
= new List<T>::Node(std::move(data)); // move it in
...
另一种方法在大多数情况下效率稍差,并且避免了代码重复:
template<class T>
void List<T>::insert(T data) // take a value (copy)
{
List<T>::Node* newNode
= new List<T>::Node(std::move(data)); // move it in
...
答案 1 :(得分:2)
如果按值传递,则避免使用不必要的数据副本,并按原样通过const引用传递。
答案 2 :(得分:-1)
通过参考更好。 数据不会被复制。这对我们所说的很重要 阶级,结构,工会等。
通过使用“const”避免了将值存储到参数的愚蠢编程错误。 即。
void dumb_print_function(Type& d){
d=3; // bad programming practice.
}
x=LongCalc();
dumb_print_function(x); // output 3 not results of "LongCalc();".