将项目添加到链表中,按引用或值传递
Adding item into a linked list, pass by reference or value?
我的部分家庭作业是实现一个通用链表。到目前为止,我编写了这个函数:
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();".
相关文章:
- 为什么可以将左值传递给"std::async",即使它引用了右值
- 无法取消引用值初始化迭代器
- 当值传递给C++中的运算符重载函数时会发生什么
- 访问对象的取消引用值的语法
- 如何访问对象的成员变量的取消引用值
- 为什么双精度引用值在分配给C++中的浮点变量时不会更改
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- C++复制按引用返回和按常量引用值返回
- 在智能指针的反引用值上调用 std::move()
- 如何将非可变参数值传递给 fmt::format?
- 将 qml 项目值传递给 cpp 后如何与它们进行交互?
- NDK:将文本字段值传递给 c++ 字符串
- 错误:无法取消引用值初始化的矢量迭代器
- 从函数返回shared_ptr的取消引用值
- 如何将值传递给 lambda 函数
- 如何在C++中将std::string值传递给RegSetValueEx()
- 模板编译错误:"X"不引用值
- 从共享指针的取消引用值中获取共享指针
- 如何将 c ++ 变量的值传递给 hadoop HDFS 的 bash 系统命令?
- 重写指向抽象类的指针的引用值无效