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

时间:2013-09-18 23:58:26

标签: c++

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


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

正如您所看到的,我通过引用获取数据,但我也可以按价值获取数据。 我的问题是什么方法更好,为什么?

3 个答案:

答案 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();".