如何连接shared_ptr的多个向量?

How to concatinate multiple vectors of shared_ptr's?

本文关键字:ptr 向量 shared 何连接 连接      更新时间:2024-05-09

我看过其他帖子,但我正在尝试使用一些<algorithm>方法。我有一个指向映射的指针,其中包含指向BaseElement类的指针向量的键,如下所示。

using ElementV = std::vector<std::shared_ptr<BaseElement>>;
using ElementM = std::map<int, ElementV>;
using SElementM = std::shared_ptr<ElementM>;
SElementM elements;

我试图做的是将存储为映射(ElementM(中的值的每个向量(ElementV(连接起来,并填充一个大的ElementV。我不想做深度复制,只想通过allElems向量中的智能指针(shared_ptr(BaseElement((访问原始元素。

以下是错误的,但给出了我要做的事情的想法。

ElementV allElems;
for (auto& index : indices) {
allElems = elements->at(index);
}

我怀疑我应该将lambas与std::copy一起使用,但一直无法获得类似于以下内容的功能,我认为这是因为迭代器。

std::copy(allElems.begin(), allElems.end(), [const elements &elems](std::vector<shared_ptr<BaseElement> &val) {
elems ...?
}

想法?

您可以通过std::map的迭代获得成对的键(第一个(和值(第二个(,因此通过std::for_each插入每个向量是一种方法。

ElementV allElems;
std::for_each(elements->begin(), elements->end(), [&allElems](const auto& p) {
allElems.insert(allElems.end(), p.second.begin(), p.second.end());
});

你可以试试这个:

ElementV allElems;
//assuming c++17 compiler
for(auto& [ind, elemVectorPtr]: *elements){ //iterate through index, element-vector pointer pair in elements map 
//copy across all pointers in element-vector into allElems vector
std::copy(elemVectorPtr->begin(), elemVectorPtr->end(), std::back_inserter(allElems)); 
}

如果您没有c++17编译器,只需直接遍历映射中的成对项即可:

for(auto& pair : *elements){
std::copy(pair.second->begin(), pair.second->end(), std::back_inserter(allElems));
}