将地图/多地图键复制到矢量或设置

时间:2017-04-11 12:48:32

标签: c++ templates stl

我在下面编写了代码,将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作为模板参数的模板函数,然后相应地创建该容器。

1 个答案:

答案 0 :(得分:2)

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

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 

Live Example

我还将<decltype(cont.begin()->first)>更改为<typename STLContainer::key_type>value_type / map的{​​{1}} multimap const key_type std::pair我们不希望vector / set