Hilfe ! Grundlagen der STL
-
Hi,
kann mir mal bitte einer sagen wo mein Denkfehler ist ?
So funktioniert es bei mir leider nicht.#include <iostream> #include <list> #include <vector> using namespace std; typedef vector<int> vc; vc::iterator vci; int main() { list<vc>test; test.push_back(vc); //füge einen vector<int> Container ans Ende der Liste test.back().push_back(1); // greife mit back() auf das letzte Element der Liste zu und füge in den Vector die Ziffer 1 in die erste Stelle int ch = test.back().*vci; // rufe den Vector aus dem letztem Element von Test und gebe die erste Stelle des Vector's aus cout << ch; }
-
Wie kommst du auf eine solche Zeile? Wenn man die Verschachtelung und typedefs mal weglässt würdest du doch auch nicht auf die Idee kommen per
vec.*std::vector<int>::iterator
auf ein Element invec
zuzugreifen. Du wolltest wohl einfach eintest.back()[0]
.Und bei dem
test.push_back(vc);
solltevc
wohl kein Typ sein sondern irgendwas das den Typvc
hat.
-
Danke Sebi707
auch wenn deine Antwort nicht das ist was ich wollte, hast du mir weiter geholfen.
Nun habe ich mein Verständnis für das Problem verbessert.
Der Code sieht nun so aus.#include <iostream> #include <list> #include <vector> using namespace std; typedef vector<int> vc; int main() { list<vc>test; test.push_back(vc());//füge einen vector<int> Container ans Ende der Liste test.back().push_back(5);// greife mit back() auf das letzte element der Liste zu und füge in den vector die Ziffer 5 in die erste Stelle cout<<*test.back().begin(); // rufe den vector aus dem letzten element von Test und gebe die erste Stelle des vectors aus }
-
Kann man natürlich machen. Es gibt übirgens auch eine
front
Funktion, die das Gegenstück zuback
ist:cout<<test.back().front();
-
jup ist mir bekannt aber ich will iterieren können und da ist mir begin() als erstes eingefallen.
Hauptsächlich hab ich nur Versucht eine größeren anderen Code zu verstehen.
Aber wie bereits erwähnt konntest Du mir ja dabei unter die Arme greifen.
-
kann mir jemand sagen warum ich das nicht zum laufen bekomme ? Ich verzweifel noch daran.
#include <list> #include <vector> #include <iostream> typedef std::vector<char>Line; //Iteration durch die Seite class Text_iterator { public: Text_iterator(std::list<Line>::iterator II, Line::iterator pp) :IN(II), pos(pp) {} char& operator*() { return *pos; } bool operator==(const Text_iterator& other)const { return IN == other.IN && pos == other.pos; } bool operator !=(const Text_iterator& other)const { return !(*this == other); } Text_iterator& operator++(); private: std::list<Line>::iterator IN; Line::iterator pos; }; Text_iterator& Text_iterator::operator++() { ++pos; if (pos == (*IN).end()) { ++IN; pos = (*IN).begin(); } return *this; } struct Document { std::list<Line> line; Document() { line.push_back(Line()); std::cout << " Document erstellt " << std::endl; } Text_iterator begin() { return Text_iterator( line.begin(), (*line.begin()).begin()); } Text_iterator end() { std::list<Line>::iterator last = line.end(); --last; return Text_iterator( last, (*last).end()); } }; // Ausgabe -------------------------------------------------------------------------------------- void print(Document& d) { for (Text_iterator p = d.begin(); p != d.end(); ++p)std::cout << *p; } // Einleseoperator------------------------------------------------------------------------------- std::istream& operator>>(std::istream& is, Document& d) { char ch; while (is.get(ch)) { d.line.back().push_back(ch); //fuege ein Zeichen hinzu if (ch == '\n') { d.line.push_back(Line{});//fuege eine neue Zeile hinzu } if (d.line.back().size()) { d.line.push_back(Line{}); // fuege abschließende leere Zeile ein return is; } } }
int main() { Document test; std::cout << "Hilfe " << std::endl; std::cin >> test; print(test); char ch; std::cin >> ch; }
-
Was soll denn überhaupt passieren? So wie ich das sehe stimmt zumindest die Geschichte mit deinen Iteratoren, nur das Einlesen in deinem
operator>>
macht komische Sachen. Durch dasif (d.line.back().size())
bricht das Einlesen ab nachdem man irgendwas anderes als einen Zeilumbruch eingegeben hat.
-
Danke Danke Du bist wieder mal mein Retter.
Da sieht man mal wieder, so länger man über Code nachdenkt des so eher übersieht man fehlerhafte Zeichensetzung.
So ist es gedacht.std::istream& operator>>(std::istream& is, Document& d) { char ch; while (is.get(ch)) { d.line.back().push_back(ch); //fuege ein Zeichen hinzu if (ch == '\n') d.line.push_back(Line{});//fuege eine neue Zeile hinzu } if (d.line.back().size()) d.line.push_back(Line{}); // fuege abschließende leere Zeile ein return is; }