c++ - 将映射/多映射键复制到 vector 或集合

标签 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 作为模板参数的模板函数,然后相应地创建该容器。

最佳答案

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

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_typemap/multimap有一个 const key_type对于 std::pair我们不希望 vector/set .

关于c++ - 将映射/多映射键复制到 vector 或集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43346387/

相关文章:

c++ - 如何使 Opencv SVM 更快?

c++ - OpenGL-从外部文件绘制点

c++ - boost managed_mapped_file : setting maximum allowed memory usage

c++ - 作为 friend 的模板参数

C++ 不同的 minmax 实现

c++ - std::string operator+() 内存泄漏?

c++ - 检查 C++ 中全局运算符 << 是否存在

c++ - SFINAE enable_if 启用 c++11 之前的构造函数

java - 如何在 Java 中生成字符串 "elegantly"?

c++ - 访问 multimap 值