如何使用空指针初始化unique_ptr的向量?

时间:2018-02-22 01:30:46

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

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

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

BTW,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;
}

3 个答案:

答案 0 :(得分:9)

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

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

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

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

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

答案 1 :(得分:1)

您可以简单地写一下:

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,但是他们知道他们什么都不应该关注。

答案 2 :(得分:0)

另一种解决方案是使用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
  ...