2016-03-30 59 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; 
} 

当然,这将失败与困惑错误消息,如果您将它称为不允许您迭代对的东西。