c++ - 如何使用对 vector 元素的 unique_ptr 引用?

标签 c++ unique-ptr

我刚开始学习 C++。

在 C 中我只使用 Node* cur_node,但在 C++ 中这不起作用:


struct Node {
        int val;
};

struct Foo {
        unique_ptr<vector<Node>> nodes;
        unique_ptr<&Node> cur_node;
};


int main() {
        Foo foo;
        foo.nodes = make_unique<vector<Node>>();
        foo.nodes->push_back((Node){.val=100});
        //d.cur_node = d.nodes[0];
        foo.cur_node = make_unique<&Node>(((*d.nodes)[0]));
        (*d.nodes)[0].val = 200;
        cout << d.cur_node->val << endl;;
        cout << (*d.nodes)[0].val << endl;;
}


error: 'Node' does not refer to a value
        unique_ptr<&Node> cur_node;

如果我不使用引用,值被复制,我无法通过修改cur_node来修改原始 vector 。

也许为此我需要 shared_ptr

编辑

更清楚一点:我想让cur_node包含对vector中的一个值的引用,通过修改cur_node来修改原始vector,只是就像我使用原始 C 指针一样。

谢谢

最佳答案

您仍然可以使用Node *,但是您需要注意 vector 的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.nodes->at(0);
    d.nodes->at(0).val = 200;
    cout << d.cur_node->val << endl;;
    cout << d.nodes->at(0).val << endl;;
}

为什么不只保留索引?

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

关于c++ - 如何使用对 vector 元素的 unique_ptr 引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57863576/

相关文章:

c++ - 用户锁定屏幕的 Windows 消息

c++ - 在 C++ 中,自定义数据结构的函数返回 vector 引发段错误

C++/pimpl : raw pointer or unique_ptr? 什么是更好的选择?

c++ - 具有虚函数和非虚函数的 unique_ptr::get() 函数

c++ - 有没有办法证明下面的第二个片段在函数声明之前插入了一个不可见的声明 `struct S;`?

c++ - 将 map 值保留为 vector

c++ - std::make_unique<std::thread> 与 lambda

c++ - 为什么 unique_ptr::release 没有用 [[nodiscard]] 定义?

c++ - 这个 unique_ptr 的初始化有什么问题?

c++ - 如何使用相同的迭代器获取列表的上一个元素?