【问题标题】:Copy map/multimap keys to vector or set将地图/多地图键复制到矢量或集合
【发布时间】:2017-04-11 12:48:32
【问题描述】:

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

【问题讨论】:

  • 只需添加您在调用函数时指定的另一个模板类型?
  • 我不想传递像 std::vector<:string> 这样的完整类型,因为我想要函数推断 std::string 本身所以想知道如何只传递 std::向量
  • 你想如何区分这些重载?
  • 当用户传递 set 和 set 时没有区别,当用户传递 vector 时,应该返回 key 的向量
  • 什么?你传了一个map或者multimap,你想怎么猜是返回vector还是set?你只有一个参数。

标签: c++ templates stl


【解决方案1】:

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

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


我还将&lt;decltype(cont.begin()-&gt;first)&gt; 更改为&lt;typename STLContainer::key_type&gt;,因为map/multimapvalue_type 有一个const key_type 用于std::pair,我们不希望vector/set .

【讨论】:

  • @Kapil 对此感到抱歉。我刚刚复制了你的代码,假设它有效。我现在已经更新了。
  • @Kapil 没问题。很高兴能提供帮助。
猜你喜欢
  • 1970-01-01
  • 2010-10-15
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2010-10-02
  • 1970-01-01
相关资源
最近更新 更多