2016-03-30 7 views
2

Die multimap ist unten wie:C++ Allgemeine Programmierung auf Multimap

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

Nun, ich möchte eine Funktionsschablone erhalten wie unten alle Wertelemente in solchen Behältern eins nach dem anderen zu drucken, einschließlich multimap aber nicht beschränkt auf diese Art von Karte und dieses spezielle Paar von Template-Parametern.

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

Funktioniert eine Vorlagenfunktion nicht? – NathanOliver

Antwort

5

einschließlich multimap aber nicht beschränkt

Wenn ich richtig verstehe, Sie eine Vorlage Template-Funktion wollen:

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

Beachten Sie, dass std::multimap und andere std::map wie Behälter nehmen tatsächlich mehr als 2 Vorlagenparameter, der Rest von ihnen hat Standardtypen.

Siehe Live Demo

+0

Gute Antwort, deckt den allgemeinen Fall ab. –

+0

Danke für Hilfe! Noch eine Frage: Auf welche Container wirkt sich diese Vorlage aus? Bisher habe ich wie multimap, unordered_multimap, map, unordered_map, noch mehr gewusst? Und so hat die Vorlage 4 Parameter, oder? Danke noch einmal. –

+0

@HuangCheng Dies funktioniert für alle Klassenvorlagen (z. B. Container) mit 4 Vorlagenargumenten. Bedenken Sie jedoch, dass Vorlagenargumente Standardwerte haben können. Daher ist die Anzahl der Vorlagenargumente, die eine Klassenvorlage hat, nicht immer offensichtlich. –

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; 
} 

Dann einfach:

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

Das OP sucht nach etwas, das nicht nur auf eine Multimap begrenzt ist. – NathanOliver

5

ich viel Glück mit generischen Container Funktionen gehabt haben:

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

Natürlich ist dies mit verwirrenden scheitern Fehlermeldungen, wenn Sie es auf etwas aufrufen, das Ihnen nicht erlaubt, über Paare zu iterieren.