【问题标题】:How to concatinate multiple vectors of shared_ptr's?如何连接多个shared_ptrs向量?
【发布时间】:2020-09-25 22:57:56
【问题描述】:

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

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

SElementM elements;

我想要做的是将每个向量 (ElementV) 作为值存储在地图 (ElementM) 中并填充一个大的 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 ...?
}

想法?

【问题讨论】:

  • copy 只移动到 existing 元素中 - 尝试使用 std::back_inserter 来适应目标向量的结束迭代器以成为插入器。除此之外 - 通常我们需要更多信息来提供帮助,例如编译器错误消息、抛出的异常等等,以及可以运行...的完整(但最少)代码

标签: c++ c++11 c++17


【解决方案1】:

您可以通过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());
});

【讨论】:

  • 这可以通过使用range-based for loop而不是std::for_each()来稍微清理一下,例如:for(const auto&amp; p : *elements) { allElems.insert(allElems.end(), p.second.begin(), p.second.end()); }
【解决方案2】:

你可以试试这个:

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

【讨论】:

    猜你喜欢
    • 2013-06-21
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多