将地图/多重地图键复制到矢量或集

Copy map/multimap keys to vector or set

本文关键字:地图 复制      更新时间:2023-10-16

我在下面编写了代码,将mapmultimap中的键转换为set

template<typename STLContainer>
inline auto CopyContanerKeyToSet(const STLContainer& cont)
{
    std::set<decltype(cont.begin()->first)> lset;
    std::transform(cont.begin(),cont.end(),std::inserter(lset,lset.end()),[](const  auto it) { return it.first;});
    return lset
}

现在要求有时我也需要将密钥转换为vector。所以我只想知道如何编写可以接受vectorset作为模板参数的模板函数,然后相应地创建该容器。

我们可以使用模板模板参数来解决这个问题。 这允许我们只指定主类型,而不指定该类型的模板类型。 这样做给了我们

template< template<typename ...> class OutputContainer, typename STLContainer>
inline auto CopyContanerKeyToSet(const STLContainer& cont)
{
    OutputContainer<typename STLContainer::key_type> lset;
    std::transform(cont.begin(),cont.end(),std::inserter(lset,lset.end()),[](const  auto it) { return it.first;});
    return lset;
}

然后我们可以用这样的东西来使用它

int main()
{
    std::map<std::string, int> foo{ {"this", 1}, {"second", 1} };
    auto output = CopyContanerKeyToSet<std::vector>(foo);
    for (const auto& e : output)
        std::cout << e << " ";
}

这给了我们

second this 

现场示例


我还<decltype(cont.begin()->first)>更改为<typename STLContainer::key_type>,因为map/multimap value_typestd::pair有一个const key_type,我们不想要vector/set