2016-07-14 17 views
-1

Angenommen, ich habe einen Satz, der n Vektoren verschiedener Größen enthält. Ich möchte sie ohne Verwendung von entfernungsbasierten Loops iterieren. Wie werde ich es tun!
// Zum Beispiel funktioniert dies aber ich habe Bereich basierend Schleifen hier Iterieren eines Satzes, der Vektoren enthält, ohne Verwendung von bereichsbasierten Schleifen oder Referenzieren auf einen Vektor

set < vector <int> > fset; 
    for(auto it : fset) 
     { 
      for(auto itt : it) 
      cout << itt << " "; 
      cout << endl; 
     } 


// Das funktioniert auch verwendet, aber ich habe ai als Vektor Referenz und iteriert Index weise

set < vector <int> > fset; 
for(set < vector <int> > :: iterator it=fset.begin();it!=fset.end();++it) 
    { 
     const vector <int>& i = (*it); 
     int l = i.size(); 
     for(int j=0; j<l; ++j) 
     cout << i[j] << " "; 
     cout << endl; 
    } 
verwendet


Ich möchte alle Vektorinhalte zeilenweise im Satz anzeigen, aber ohne ut unter Verwendung einer der oben genannten Methoden. Bitte helfen Sie mir, wie werde ich es tun! Danke!

+2

Wäre das deine Hausaufgabe? –

+1

Sie haben gerade einen Iterator für den Satz verwendet, tun Sie es auch für den zugrunde liegenden Vektor, fertig. –

+0

Ich bin neu zu lernen stl in cpp und ich habe versucht, aber ich bekomme Fehler! @Gill Bates –

Antwort

0

Von dem, was ich verstehe, sollte dies Ihren Satz von Vektoren drucken:

set <vector <int> > data; 

for (const auto& row : data) 
{ 
    for (int value : row) 
    cout << value << ", "; 
    cout << "\n"; 
} 

können Sie Passen Sie die Formatierung zwischen den Elementen eines Vektors in der inneren Schleife und dem am Anfang oder Ende der Zeile vor oder nach der inneren Schleife an.

Mit Iteratoren:

for (auto row_it = data.begin(); row_it != data.end(); ++row_it) 
{ 
    for (auto value_it = row_it->begin(); value_it != row_it->end(); ++value_it) 
    cout << *value_it << ", "; 
    cout << "\n"; 
} 

Diese beiden Dinge tun, die genau die gleiche Sache. Der Ranged-For fügt nur eine Ebene der Indirection hinzu, indem man am Anfang der inneren Schleife etwas wie

etwas wie

hinzufügt.

Hoffe, das hilft.

(oops. Festtippfehler.)


Finale bearbeiten
Ich vermute, Sie sind mit einem älteren C++ Compiler stecken (C++ 98 oder C++ 03, die im Grunde ist die gleiche Sache), wenn Sie vermeiden möchten, auto.

Um die Iteratoren richtig zu benennen, müssen Sie über den Typ nachdenken, den sie darstellen. Etwas, das hier nicht offensichtlich ist, nur den Code zu betrachten, ist, dass Sie nicht die Werte des Satzes ändern können. Daher müssen alle inneren Iteratoren const sein.

Da Sie jedoch nur den Satz selbst drucken, können Sie auch explizit angeben und einen Const-Iterator für die äußere Schleife verwenden.

for (set <vector <int> > ::const_iterator row_it = data.begin(); row_it != data.end(); ++row_it) 
{ 
    for (vector <int> ::const_iterator value_it = row_it->begin(); value_it != row_it->end(); ++value_it) 
    cout << *value_it << ", "; 
    cout << "\n"; 
} 

Hoffe, dass hilft.

+0

Was hast du nicht verstanden? "Ich möchte sie ohne Verwendung von entfernungsbasierten Loops iterieren."? –

+1

Ich möchte einen Iterator für den Satz sowie für den Vektor verwenden und alle von ihnen anzeigen. Ich habe versucht, den Vektor zu iterieren, aber ich bekomme einen Kompilierungsfehler in einer Online-IDE. Die Verwendung von Entfernungs-basierten Schleifen ist einfach, aber ohne sie zu benutzen, müssen wir wissen, wie der Iterator funktioniert, deshalb. @GillBates –

+1

Was hast du nicht über tatsächliche Problemlösung verstanden? Ich versuche dem OP zu helfen, sein Problem zu lösen, nicht ein Idiot zu sein und seine Frage nur mit der wörtlich möglichen Antwort zu beantworten. Offensichtlich will OP das Set drucken und kämpft darum. –

1

Benötigt C++ 14 (aber leicht umwandelbar in C++ 11 als auch)

#include <iostream> 
#include <ostream> 
#include <iterator> 
#include <set> 
#include <vector> 

int main() { 
    std::set<std::vector<int>> svec = { 
    {1,2,3}, 
    {4,5,6} 
    }; 
    std::for_each(std::begin(svec), std::end(svec), 
       [](const auto& vec) { 
        std::copy(std::begin(vec), std::end(vec), 
          std::ostream_iterator<int>(std::cout, " ")); 
        std::cout << '\n'; 
       }); 
    return 0; 
}