2016-01-01 15 views
7

kam ich mit dem Follow-up:Pass eine std Behälter auf eine Funktion

template <typename T> inline void printcontainer(std::vector<T> container) 
{ 
    for(auto it = container.begin(); it != container.end(); it++) 
    { 
     std::cout << *it << std::endl; 
    } 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::vector<int> v; 
    v.push_back(5); 
    v.push_back(4); 
    v.push_back(3); 
    printcontainer(v); 

    return 0; 
} 

(Sorry für die push_backs, Visual Studio nicht akzeptiert initializer Listen ... igitt !!)

jetzt Diese Funktion ist auf std::vector begrenzt, wie kann ich es so machen, dass ich andere Container, wie std::list Arrays etc ...

+0

Welche Version von VC++ verwenden Sie das nicht initializer Listen nicht unterstützt? – MikeMB

+0

Visual Studio 2012, Dinge wie 'std :: vector v {1,2,3};' wird nicht unterstützt, so dass Sie die c-style Array-Workaround verwenden müssen, die ich ziemlich verachten. Auch hat es nicht 'std :: initializer_list' ziemlich seltsam eh. –

+0

Richtig, ich habe mich so an C++ 11 gewöhnt, dass ich vergessen habe, dass VS viele/am meisten angenommen hat? C++ 11 Funktionen nicht vor VS 2013. – MikeMB

Antwort

7

übergeben kann Einfach nicht Vorlage auf den Typ von dem Container gespeichert, aber auf die Art der Behälter selbst:

template <typename Container> 
inline void printcontainer(const Container &container) 

Beachten Sie, dass ich das Argument in const Referenz geändert habe, um eine unnötige Kopie zu vermeiden.

template <typename Container> 
inline void printcontainer(const Container &container) { 
    for (const auto &v : container) 
     std::cout << v << "\n"; 
} 

OT Bemerkung:

Sie können Ihre Druckfunktion C-Arrays unter Verwendung des Dritt std::begin und std::end oder durch die Verwendung eines range based for loop verallgemeinern Sie wahrscheinlich die inline hier nicht brauchen.

+0

wow ich bin sehr beeindruckt von 'für (const auto & v: container)' wie heißt das? Ich werde es studieren –

+2

[Range-basierte für Schleife (seit C++ 11)] (http://en.cppreference.com/w/cpp/language/range-for) – Drop

+0

Tyvm, ich werde diese Antwort akzeptieren so bald wie möglich! –

2

Das Übergeben von Containerobjekten ist gegen den STL klassischen Stepanov-Container-Iterator-Algorithmus Generic Programming style.

Normalerweise würde man passieren Iteratoren:

# define ForwardIterator typename // workaround untill we have concepts 

template <ForwardIterator It> inline void printcontainer(It begin, It end) 
{ 
    for(;begin != end; ++begin) 
    { 
     std::cout << *begin << std::endl; 
    } 
} 

Verbrauch:

std::vector<int> v = {1, 2, 3, 4}; 
printcontainer(v.cbegin(), v.cend()); 
+0

* "Sie versuchen, Java in C++ - Dateien zu schreiben." * Wie? Ich sehe kein Problem damit, den Container hier zu übergeben.Tatsächlich bietet boost viele Containerversionen der Iterator-basierten Funktionen in der Standardbibliothek, um die Ausführlichkeit zu verringern. (Nicht mein dv btw.) –

+0

@BaummitAugen Okay, es war ein bisschen zu viel, ich werde diesen Satz entfernen;) – Drop

+1

Während dies nominell OK scheint, ist dieses Makro einfach abscheulich und verdient einen ganzen Sonderpreis. Auch Schrauben Iteratoren, Bereiche sind die Zukunft. – Puppy

Verwandte Themen