CPP中的链接类

互联网 更新时间:2023-04-26 21:00:56

Rem*_*eau 6

指针在 C++ 中的工作方式与在 Pascal 中的工作方式完全相同。唯一的区别在于您如何分配释放所指向的事物。

例如,您可以声明一个局部变量并指向它,例如:

int i = 12345;
int *p = &i;
// use p as needed...

这相当于在 Pascal 中:

var
  i: Integer;
  p: ^Integer;
begin
  i := 12345;
  p := @i;
  // use p as needed...
end;

或者,您可以使用newdelete来处理动态分配的变量,例如:

someType *data = new someType;
// use data as needed ...
delete data;

这相当于在 Pascal 中:

type
  someType = record
    ...
  end;

var
  data: ^someType;
begin
  New(data);
  // use data as needed ...
  Dispose(data);
end;

但是,现代 C++ 代码应尽量避免直接使用new/ delete。使用智能指针代替(std::unique_ptrand std::shared_ptr、viastd::make_unique()std::make_shared()),当它们超出范围并被销毁时会自动释放内存。这有助于使代码更安全,并且在指向数据的所有权语义方面更具自文档性。仅在需要访问数据而不转移所有权的情况下使用原始指针,例如:

void doSomething(someType *data)
{
    // use data as needed ...
}

{
    auto data = std::make_unique<someType>();
    doSomething(data.get());
} // <-- data is freed automatically here!

您描述的类的类型更正式地称为“链表”的节点/元素,通常使用new/实现delete,例如:

#include <iostream>

struct node
{
    int data;
    node* next = nullptr;
};

node *head = nullptr;
node *tail = nullptr;

void addToList(int data)
{
    node **n = (tail) ? &(tail->next) : &head;
    *n = new node{data};
    tail = *n;
}

void clearList()
{
    node *n = head;
    while (n) {
        node *next = n->next;
        delete n;
        n = next;
    }
    head = tail = nullptr;
}

void printList()
{
    node *n = head;
    if (n)
    {
        std::cout << n->data;
        while ((n = n->next) != nullptr) {
            std::cout << ", " << n->data;
        }
    }
    std::cout << std::endl;
}

int main()
{
    addToList(12345);
    addToList(67890);
    printList();
    clearList();
    return 0;
}

但是,链表并不是使用智能指针的好例子。是的,head指针至少可以是智能指针。但是,你仍然要迭代列表摧毁各个节点,在之前unique_ptr破坏了head节点。您可能也想使next指针成为智能指针,但这样做是个坏主意,因为在销毁大型链表时,递归析构函数调用可能会炸毁调用堆栈。迭代循环更适合销毁链表,而next成为智能指针并不适合该用例。

但是,在任何情况下,C ++内置了标准类双链表std::list)和单链表std::forward_list),其处理链接指向你,这样你就可以更专注于您的类数据,减少对如何类实例链接在一起,例如:

#include <iostream>
#include <list>

std::list<int> l;

void printList()
{
    auto iter = l.begin();
    if (iter != l.end())
    {
        std::cout << *iter;
        while (++iter != l.end()) {
            std::cout << ", " << *iter;
        }
    }
    std::cout << std::endl;
}

int main()
{
    l.push_back(12345);
    l.push_back(67890);
    printList();
    return 0;
}

更多推荐

链接,CPP

本文发布于:2023-04-26 21:00:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/hyzx/80799d9f82bdf09399fb5f0c385e4891.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:链接   CPP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 89740文章数
  • 23101阅读数
  • 0评论数