使用 STL 在容器中创建共享对象

Create shared objects in container using STL

我正在尝试生成一个包含共享对象的容器。 比如说,两个 linked 列表有几个公共节点。

L1 : {1 2 3 2 1} 和 L2 : {2 1}

我知道如果我们使用 Node* head 并将动态创建的对象添加为 link,则可以在两个 linkedlist 中链接公共对象,但是是否可以创建这样的共享对象对象直接在容器中 ?

我正在尝试这样的事情:

std::forward_list<int> listOne{1,2,3,2,1}; // 2,1 are meant to be shared
std::forward_list<int> listTwo{1};
listTwo.insert_after(listTwo.begin(), 
std::next(listOne.begin(), 3), listOne.end()); // taking 2,1 from listOne

但是,那只会创建另一个新分配。

我假设这可能由于迭代器失效场景等产生异常行为而被禁止,但我不确定。还有其他办法吗?

您可以为此创建一个共享指针列表。

std::list<int> listInt {1,2,3,2,1};

std::list<std::shared_ptr<int>> listOne{};
std::list<std::shared_ptr<int>> listTwo{};

size_t counter = 0;
for(int elem : listInt)
{
    auto ptr1 = std::make_shared<int>(elem);
    listOne.push_back(ptr1);
    if(counter < 3)
        listTwo.push_back(std::make_shared<int>(elem));
    else
        listTwo.push_back(ptr1);
    counter++;
}

您可以使用 std::shared_ptr,因为这将使它的对象保持活动状态,而不管指向同一对象的另一个 std::shared_ptr 从不同的容器中删除。

容器类型对此并不重要,因此您可以使用 std::vector 例如:

    std::vector<std::shared_ptr<int>> v1
    {
        std::make_shared<int>(1),
        std::make_shared<int>(2),
        std::make_shared<int>(3),
        std::make_shared<int>(2),
        std::make_shared<int>(1),
    };

    std::vector<std::shared_ptr<int>> v2
    {
        v1[3],
        v1[4],
    };

    std::cout << "v1" << '\n';
    for(auto& sp: v1)
        std::cout << *sp << '\n';

    std::cout << "v2" << '\n';
    for(auto& sp: v2)
        std::cout << *sp << '\n';

    v1.pop_back(); // remove from one container but
    v1.pop_back(); // still alive and kicking in the other 
    std::cout << "----" << '\n';

    std::cout << "v1" << '\n';
    for(auto& sp: v1)
        std::cout << *sp << '\n';

    std::cout << "v2" << '\n';
    for(auto& sp: v2)
        std::cout << *sp << '\n';

输出:

v1
1
2
3
2
1
v2
2
1
----
v1
1
2
3
v2
2
1