将项目添加到链表中,按引用或值传递

Adding item into a linked list, pass by reference or value?

本文关键字:引用 值传 项目 添加 链表      更新时间:2023-10-16

我的部分家庭作业是实现一个通用链表。到目前为止,我编写了这个函数:


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++;
}

如您所见,我是通过引用获取数据的,但我也可以通过值获取数据。我的问题是哪种方法更好,为什么?

在 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
...

如果按值传递,请避免不必要的数据副本,请像以前一样通过 const 引用传递它。

按引用更好。不会复制数据。 我们正在谈论的这可能很重要阶级、结构、工会等

通过使用"const"避免了将值存储到参数的愚蠢编程错误。即

void dumb_print_function(Type& d){
    d=3;  // bad programming practice.
    }
x=LongCalc();
dumb_print_function(x); // output 3 not results of "LongCalc();".