繁体   English   中英

std :: vector vs std :: initializer_list问题:未定义bahevior

[英]std::vector vs std::initializer_list issue: undefined bahevior

我有此帮助程序方法可以附加到链表(下面的代码):

void append(const std::initializer_list<T>& vals) {                               
            for (const auto& val : vals)                                                    
              append(val);                                                                  
} 

我首先尝试用std :: vector附加1,5,7,9像这样:

void append(const std::vector<T>& vals) {                               
            for (const auto& val : vals)                                                    
              append(val);                                                                  
} 

但是它用0,0,7,9而不是1,5,7,9填充了链表。 有什么想法吗?

这是完整的代码:

    template <typename T>                                                               
    class LinkedList {                                                                  
    private:                                                                            
      struct Node {                                                                     
        const T& val_;                                   
        std::shared_ptr<Node> next_ = nullptr;                                          
        Node(const T& val) : val_(val) {}                                               
      };                                                                                
    public:                                                                             
      std::shared_ptr<Node> head_ = nullptr;                                            
      std::shared_ptr<Node> current = nullptr;                                          

      // could be optimized                                                                                 
      void append(const std::initializer_list<T>& vals) {                               
        for (const auto& val : vals)                                                    
          append(val);                                                                  
      }                                                                                 

      void append(const T& val) {                                                       
        if (!head_) {                                                                   
          head_ = std::make_shared<Node>(val);                                          
          return;                                                                       
        }                                                                               
        current = head_;                                                                
        while (current->next_)                                                          
          current = current->next_;                                                     
        current->next_ = std::make_shared<Node>(val);                                   
      }                                                                                 

      template <typename Func>                                                          
      void for_each(Func f) {                                                           
        current = head_;                                                                
        while (current) {                                                               
          f(current->val_);                                                             
          current = current->next_;                                                     
        }                                                                               
      }                                                                                 


    };                                                                               

    int main() {                                                                     
      LinkedList<int> lst;                                                           
      lst.append({1,5,7,9});                                                         
      auto printer = [](int val) {                                                   
        std::cout << val << " ";                                                     
      };                                                                             
      lst.for_each(printer);                                                         
      std::cout << '\n';                                                                            
    }                                 

这里的一个编程错误是您的节点存储了一个引用const T& val_; 存储值,而不是const T val_;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM