0

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


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

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

4

3 回答 3

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
...
于 2013-09-19T00:11:23.033 回答
2

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

于 2013-09-19T00:00:32.677 回答
-1

参考比较好。数据不会被复制过来。我们谈论的是阶级、结构、工会等,这可能很重要。

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

void dumb_print_function(Type& d){
    d=3;  // bad programming practice.
    }
x=LongCalc();

dumb_print_function(x); // output 3 not results of "LongCalc();".
于 2013-09-19T00:39:35.077 回答