You can still use Node *, however you need to be careful of the vector's pointer invalidation rules.
struct Foo { unique_ptr<vector<Node>> nodes; Node * cur_node; }; int main() { Foo foo; foo.nodes = make_unique<vector<Node>>(); foo.nodes->push_back((Node){.val=100}); foo.cur_node = d&d.nodes->at(0).get(); d.nodes->at(0).val = 200; cout << d.cur_node->val << endl;; cout << d.nodes->at(0).val << endl;; } Why not just hold the index?
struct Foo { unique_ptr<vector<Node>> nodes; size_t cur_index; Node & cur_node() { return nodes->at(cur_index); } }; int main() { Foo foo; foo.nodes = make_unique<vector<Node>>(); foo.nodes->push_back((Node){.val=100}); foo.cur_index = 0; d.nodes->at(0).val = 200; cout << d.cur_node().val << endl;; cout << d.nodes->at(0).val << endl;; }