我在下面编写了代码,将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
作为模板参数的模板函数,然后相应地创建该容器。
答案 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
我还将<decltype(cont.begin()->first)>
更改为<typename STLContainer::key_type>
,value_type
/ map
的{{1}} multimap
const key_type
std::pair
我们不希望vector
/ set
。