使用 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
我正在尝试生成一个包含共享对象的容器。 比如说,两个 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