相关疑难解决方法(0)

使用智能指针的C++链接列表

我只使用链接列表的原始指针和模板.例如,成员数据,Node<T>* head;当我插入节点时,其中一行是head = new Node<T>(data);.

但是,现在我需要使用智能指针,我不知道如何更改它以使用智能指针.会员数据是否会更改为shared_ptr<Node<T>> head;,另一行会更改为
head = shared_ptr<Node<T>>( new <Node<T>>(data) );

c++ templates pointers linked-list

8
推荐指数
2
解决办法
7018
查看次数

unique_ptr:链表项删除

我目前正在考虑在unique_ptrs的帮助下实现单个链表.尽管由于析构函数的递归调用可能导致堆栈溢出的问题(请参阅Stack overflow with unique_ptr链表),但我遇到了以下问题:假设,我们有以下链表实现

struct node {
  node (void) : val(0), next(nullptr) {}
  int val;
  std::unique_ptr<node> next;
};
Run Code Online (Sandbox Code Playgroud)

我们已经按照初步确定了我们的清单

int main (int argc, char* argv[]) {
  node HEAD;
  HEAD.val = 0;
  auto ptr = &HEAD;
  for (int i = 0; i < 10; ++i) {
    ptr->val = i;
    ptr->next.reset(new node);
    ptr = ptr->next.get();
  }
  ptr->val = 10;
  ...
Run Code Online (Sandbox Code Playgroud)

现在,我想删除值为1的节点:

ptr = &HEAD;
ptr = ptr->next.get();
HEAD.next = std::move(ptr->next);
Run Code Online (Sandbox Code Playgroud)

乍一看,这似乎是明智的.不过,我不确定它是否会导致未定义的行为:

根据http://en.cppreference.com/w/cpp/memory/unique_ptr/operator%3D,运营商=

将所有权从r转移到*这就好像通过调用reset(r.release())然后从std :: forward(r.get_deleter())分配get_deleter()一样

仔细看看unique_ptr :: reset( …

c++ linked-list undefined-behavior unique-ptr

7
推荐指数
1
解决办法
549
查看次数

std :: unique_ptr <>作为基于节点的结构中的指针

由于大多数人都喜欢谜题,我会用一个(拼写错误:)开始这个问题.想得到介绍,请注意,如果你不关心它,你可以跳过热身(JG问题)并阅读G问题,因为那是我的"真正的问题".

在审查潜在新员工提供的代码示例时,您偶然发现了一个链接列表,其实现使用了现代C++ 11特性,即std :: unique_ptr <>.

template <typename T> 
struct Node { 
   T data; 
   std::unique_ptr<Node<T>> next; 
   Node () {} 
   Node(const T& data_): data(data_) {} 
   Node(Node& other) { std::static_assert(false,"OH NOES"); } 
   Node& operator= (const Node& other) { 
     std::static_assert(false,"OH NOES"); 
     return *new Node(); 
   } 
public: 
   void addNext(const T& t) { 
      next.reset(new Node<T>(t)); 
   }
};

template<typename T>
class FwdList
{
    std::unique_ptr<Node<T>> head;
public:
    void add(const T& t)
    {
        if (head == nullptr)
            head.reset( new Node<T>(t));
        else {
            Node<T>* curr_node = head.get(); …
Run Code Online (Sandbox Code Playgroud)

c++ unique-ptr c++11

5
推荐指数
1
解决办法
1984
查看次数