【问题标题】:How to initialize a vector of unique_ptr with null pointers?如何使用空指针初始化 unique_ptr 向量?
【发布时间】:2018-08-01 18:15:09
【问题描述】:

我需要用nullptrs 初始化vector<unique<TNode>>this帖子中的方法太复杂了。我的情况很特殊,因为我只需要将其初始化为nullptr。我怎样才能实现它?

我知道我每次都可以使用 for 循环到 push_backnullptr。有没有优雅的方法?

顺便说一句,make_unqiue 在我的编译器上不起作用。

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

struct TNode {
    //char ch;
    bool isWord;
    vector<unique_ptr<TNode> > children;
    TNode(): isWord(false), children(26,nullptr) {}
};

int main()
{
    TNode rt;
    return 0;
}

【问题讨论】:

  • : children(26) 怎么样?
  • BTW, make_unqiue does not work on my compiler. 在这种情况下它不支持 C++14。
  • @DeiDei 也许make_unique 会起作用

标签: c++ stl c++14 unique-ptr


【解决方案1】:
std::vector<std::unique_ptr<int>> v (10);

它将创建一个包含 10 个 unique_ptr 对象的向量,所有这些对象都默认初始化(不制作任何副本)。 unique_ptr 的默认初始化不指向任何内容。

请注意,这与此完全不同:

std::vector<std::unique_ptr<int>> v (10, nullptr);

尝试使用初始化为nullptrunique_ptr 的10 个副本来初始化向量,由于无法复制unique_ptr,因此无法完成。

【讨论】:

    【解决方案2】:

    你可以简单地写:

    struct TNode {
    
        Tnode(unsigned required_children) :
            children(required_children) {}
    ...
    
         vector<unique_ptr<TNode> > children;
    

    std::unique_ptr constructor 上的页面您会看到:

    构造一个不拥有任何东西的 std::unique_ptr。

    到您在结构的构造函数中传递的数字。所以你可以这样做:

    TNode rt(number_I_want);
    

    您的向量中将有 number_I_want 唯一指针。他们不一定持有nullptr,但他们知道他们没有持有任何你应该关心的东西。

    【讨论】:

      【解决方案3】:

      另一种解决方案是使用std::array,这样您可以更轻松地指定尺寸。

      #include <array>
      
      class TNode {
       private:
        struct TNode {
          bool end_of_word = false;
          std::array<std::unique_ptr<TNode>, 26> links;
        };
      
        TNode root;
        // The rest of your Trie implementation
        ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-23
        • 1970-01-01
        • 2015-04-28
        • 2012-06-13
        • 1970-01-01
        相关资源
        最近更新 更多