2017-04-11 25 views
1

我已經寫了下面的代碼鍵在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作爲模板參數,然後在相應地創建該容器。

+0

只需添加您在調用函數時指定的另一個模板類型? – NathanOliver

+0

我不想像std :: vector 那樣傳遞完整類型,因爲我想要函數推導出std :: string本身,所以想知道如何只傳遞std :: vector – Kapil

+0

以及如何區分這些重載? – luk32

回答

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>map/multimapvalue_type先後爲std::pair這是我們不希望的vector/set一個const key_type

+0

back_inserter將無法使用集 – Kapil

+0

@Kapil對不起。假設它起作用,我剛剛複製了你的代碼。我現在更新了它。 – NathanOliver

+0

感謝彌敦道精彩的回答 – Kapil