I don't see the need for `unique_ptr` for the root node. spNode root; I would just make this a node. Node root; The use of `std::map` is fine. But it does have `O(log(n))` lookup. If you switch back to an array its `O(1)`. Its a time for space thing. Pick the one you want. I don't like the two line creation of nodes. std::unique_ptr<Node> node(new Node()); temp->children[c] = std::move(node); Just use reset: temp->children[c].reset(new Node()); Or if you have C++14 use `std::make_unique()` temp->children[c] = std::make_unique<Node>(); Personally `search()` does not seem quite the correct verb. bool search(const std::string& str); What is wrong with `find()`?