我写了下面的代码来将 map
或 multimap
中的键转换为 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
。所以我只想知道如何编写可以接受 vector
或 set
作为模板参数的模板函数,然后相应地创建该容器。
最佳答案
我们可以使用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
我也改了<decltype(cont.begin()->first)>
至 <typename STLContainer::key_type>
作为value_type
的 map
/multimap
有一个 const key_type
对于 std::pair
我们不希望 vector
/set
.
关于c++ - 将映射/多映射键复制到 vector 或集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43346387/