2016-03-30 108 views
2

的多重映射泛型編程是象下面這樣:C++對Multimap之

int main() { 
    multimap<int, string> coll; 
    coll = { {5, "tagged"} , 
      {2, "a"} , 
      {1, "this"} , 
      {4, "of"} , 
      {6, "strings"} , 
      {1, "is"} , 
      {3, "multimap"} 
      }; 
} 

現在,我想獲得像下面的函數模板逐一打印這種容器的所有值的元素,包括multimap但不限於這種類型的映射和這對特定的模板參數。

void PrintAllMaps(multimap<int, string> map) { 
    for (auto elem : map) { 
     cout << elem.second << ' '; 
    } 
    cout << endl; 
} 
+3

模板功能不起作用嗎? – NathanOliver

回答

5

包括多重映射但

如果我理解正確的話,你想有一個模板的模板功能不侷限於:

template < 
    typename T1, 
    typename T2, 
    typename T3, 
    typename T4, 
    template <typename, typename, typename, typename> class M> 
void PrintAllMaps(M<T1, T2, T3, T4>& map) { 
    ... 
} 

注意std::multimap和其他std::map類似容器採取其實更多而不是2個模板參數,其餘的都有默認的類型。

Live Demo

+0

很好的答案,涵蓋了一般情況。 –

+0

感謝您的幫助!另一個問題:這個模板會影響什麼容器?到目前爲止,我已經知道像multimap,unordered_multimap,map,unordered_map,更多?而這樣的模板確實有4個參數,不是嗎?再次感謝。 –

+0

@HuangCheng這將適用於所有具有4個模板參數的類模板(例如容器)。請記住,模板參數可以具有默認值,因此類模板具有的模板參數數量並不總是很明顯。 –

0
template <class TKey> 
template <class TValue> 
void PrintMapToStream(std::ostream &stream, multimap<TKey, TValue> map) 
{ 
    for (auto elem : map) 
     stream << elem.second << ' '; 

    stream << std::endl; 
} 

然後,只需:

PrintMapToStream(std::cout, map); 
+1

OP正在尋找不僅限於多圖的東西。 – NathanOliver

5

我有好運氣與通用容器功能:

template <class Map> 
void PrintMapToStream(std::ostream &stream, const Map &map) { 
    for (auto &elem : map) 
     stream << elem.second << ' '; 
    stream << std::endl; 
} 

當然,這將失敗與困惑錯誤消息,如果您將它稱爲不允許您迭代對的東西。