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 in vec zuzugreifen. Du wolltest wohl einfach ein test.back()[0] .

    Und bei dem test.push_back(vc); sollte vc wohl kein Typ sein sondern irgendwas das den Typ vc 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 zu back 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 das if (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;
    
    }
    

Log in to reply