# STL Vector ausgeben



## no82 (4. Februar 2009)

Hallo,
wie kann ich denn einen 2 dimensionalen vector ausgeben. Dieser hat folgende Form
vector<vector<int>>
Vielen Dank


----------



## Mr.Undertaker (4. Februar 2009)

Was für ein Problem hast du damit denn genau?

Iteriere duch beide und schreib die ints raus?


----------



## no82 (4. Februar 2009)

Es ist nur so, dass die Container eine unbestimmte Groesse haben. Ich muesste mit Zeigern arbeiten und bin mir mit der Syntax nicht schluessig. Waere froh,wenn du mir da weiterhelfen koenntest.


----------



## vfl_freak (4. Februar 2009)

Moin,

so auf die schnelle "vom Hirn in die Tastatur", würde ich das so machen:

```
vector<int> vecInteger;
vector<vecInteger> vAeußererVektor;

..... // die Vektoren füllen

vector<vector <int>>::iterator itAußen;
for( itAußen = vAeußererVektor.begin(); itAußen != vAeußererVektor.end(); itAußen++)
{
    vector<int> vInnererVektor = *itAußen;
    vector<int>::iterator itInnen;    
    for( itInnen = vInnererVektor.begin(); itInnen != vInnererVektor.end(); itInnen++)
    {
        int iValue = *itInnen;
        ...
        // tue irgendwas mit iValue
    }
}
```
Gruß
Klaus


----------



## no82 (4. Februar 2009)

Vielen Dank werds gleich mal probieren.


----------



## vfl_freak (4. Februar 2009)

Moin,

oh, bitte - gerne  viel Erfolg!
Und es wäre schön, wenn du anschließend hier ein Feedback für Nachwelt reinschreiben würdest 

Gruß
Klaus


----------



## devDevil (4. Februar 2009)

Würde spontan den Std. ein wenig mehr nutzen 


```
#include <iostream>
#include <algorithm> // std::copy
#include <iterator> // std::ostream_iterator
#include <fstream> // std::ofstream
#include <vector>

int main()
{
    // datensatz anlegen
    std::vector<int> data(100, 10);

    // datei öffnen
    std::ofstream file_stream("storage.dat");
    if (!file_stream) { std::cerr << "FEHLER: Daten konnten nicht gespeichert werden!"; return 1; }
    
    // datensatz in datei kopieren
    std::copy(data.begin(), data.end(), std::ostream_iterator<int>(file_stream, " "));
}
```
 und einlesen geht genauso


----------



## vfl_freak (4. Februar 2009)

Hallo devDevil,

hmm, irgendwie versteh' ich Deine Antwort jetzt nicht so ganz! :suspekt:

Wo steht was von Datei-Ein/Auslesen? Scheinbar will er doch einen Vektor voll Vektoren auslesen, oder?

Was genau macht denn dieses
std::vector<int> data(100, 10);

Das ist mir bislang noch nicht untergekommen! Meine Hilfe hier von VS6 sagt lediglich : "... liefert einen Zeiger auf der erste Element der Sequenz ...". Ich bekomme doch dadurch nur einen eindimensionalen Vektor, oder 

Kleine Aufklärung hierzu wäre nett 

Gruß
Klaus


----------



## devDevil (4. Februar 2009)

Jo sorry hatte das 2 dimensionale überlesen 


```
#include <iostream>
#include <algorithm> // std::copy
#include <iterator> // std::ostream_iterator
#include <fstream> // std::ofstream
#include <vector>

int main()
{
    // datensatz anlegen
    std::vector< std::vector<int> > data(100, std::vector<int>(10, 10));
 
    // datei öffnen
    std::ofstream file_stream("storage.dat");
    if (!file_stream) { std::cerr << "FEHLER: Daten konnten nicht gespeichert werden!"; return 1; }

    // datensatz in datei kopieren
    for (std::vector< std::vector<int> >::const_iterator it(data.begin()); it != data.end(); ++it)
    {       
         std::copy(it->begin(), it->end(), std::ostream_iterator<int>(file_stream, " "));
         file_stream << '|';
    }
}
```
So das ist nur nen Beispieldatensatz (data is jetzt mit 100 std:vector<int>(10, 10) gefüllt)
Ehm jeder Vektor wird vom anderen durch | getrennt. Die einzellnen Werte durch ' '. Dadurch kannst du sehr einfach per std::istream_iterator das einlesen vornehmen


----------



## no82 (5. Februar 2009)

Die Variante mit den Pointern funktioniert perfekt. Nun ist eine erneute Schwierigkeit aufgetauch:

*
class myclass
{
public:
int x,y;
double index;
}; *

vector<myclass> Objekt;

Wie kann ich denn jetzt die Variablen x,y und index belegen bzw. bearbeiten?


----------



## vfl_freak (5. Februar 2009)

Moin,
im Prinzip genauso wie oben 
Mit einem Iterator durch den vector laufen, die einzelnen Elemente einem entsprechenden Objekt zuweisen, und mit <object.x> usw. ansprechen!
Gruß
Klaus


----------



## no82 (5. Februar 2009)

Meintest du sowas:

class myclass
{
public:
int x,y;
};

myclass ob1;
ob1.x = 10;
vector<myclass> Objekt;
vector<myclass>::iterator ptr_Objekt;
Objekt.push_back(ob1);
for(ptr_Objekt = Objekt.begin();ptr_Objekt=Objekt.end();ptr_Objekt++)
{
int x=ptr_Objekt->x;
}
das klappt auch ganz gut. Ein dirketer Zugriff ist aber nicht moeglich oder?


----------



## vfl_freak (5. Februar 2009)

Moin,

prima, das es klappt!

Aber ich verstehe Deine Frage nicht :suspekt:


> Ein direkter Zugriff ist aber nicht möglich, oder?


DAS ist doch der direkte Zugriff: _*<object>.<element>*_ 

Gruß
Klaus


----------



## no82 (5. Februar 2009)

Hmm, ich hab mich falsch ausedrueckt. Ich wollte wissen, ob es denn noch eine andere Moeglichkeit gibt auf *Objekt* (vector<myclass> Objekt) zuzugreifen. Also nicht mit einem Iterator durch den vector laufen, sondern "direkt". Also in der Form:
*Objekt[x](<objekt>.<element>)*
Gruss


----------



## vfl_freak (5. Februar 2009)

Nein, das kann nicht gehen, ist ja kein Array oder so ... :suspekt:

Es geht lt. meine Hilfe nur sowas:
vector:perator[]@import url(stylesheets/msdn_ie4.css);const_reference *operator[]*(size_type pos) const; reference *operator[]*(size_type pos);Das habe ich aber noch nie verwendet!

Gruß
Klaus


----------



## deepthroat (5. Februar 2009)

vfl_freak hat gesagt.:


> Nein, das kann nicht gehen, ist ja kein Array oder so ... :suspekt:


Und trotzdem ist der Indexoperator für std::vector definiert und man kann ganz einfach auf das i-te Elemente wie üblich zugreifen:

```
std::vector<int> foo(10, 10);

foo[2] = 5;
```

Gruß

PS: Und bitte verwendet die Code Tags.


----------



## vfl_freak (5. Februar 2009)

> PS: Und bitte verwendet die Code Tags


Jau, da ist bei letzten Post was schiefgelaufen ...    mea culpa 

Mal dumm gefragt, wenn dass so geht, wozu brauch ich dann die Iteratoren  

Gruß
Klaus

EDIT: Blödsinn - alles klar ... hatte wohl eben 'nen kleinen Blackout :-( Ich nutze das hier ja genau so, wie Du es beschrieben hast, nur eben mit mit Iterator in der Schleife! Ich nehme also alles zurück und behaupte das Gegenteil ^^


----------



## no82 (6. Februar 2009)

Hallo,
ich werd diese Vectoren nicht mehr los. Hab ein neues Problem: ich wuerde gern einen 2d Vector belegen. Dieser vector hat wieder die Form vector<vector<MYclass>>.
Hab mir dazu folgendes ueberlegt:
*
#include<iostream>
#include<vector>
using namespace std;


class MyIndex
{
public:
double X;
double Y;
int index;
};	

static vector<MyIndex> Dreieck(MyIndex&,MyIndex&,MyIndex&,vector<MyIndex>);
int main ()
{
	MyIndex Punkt_a,Punkt_b,Punkt_c ;
	vector<vector<MyIndex> > Objekt;
	vector<MyIndex> Dreieck_;
	vector<MyIndex>::iterator ptr_Punkte;
	vector<vector<MyIndex> >::iterator ptr_Objekt;
//-------------------------------------------------------------	
	Punkt_a.X=10;
	Punkt_a.Y=13;
	Punkt_a.index=1;
	Punkt_b.X=20;
	Punkt_b.Y=23;
	Punkt_b.index=2;
	Punkt_c.X=30;
	Punkt_c.Y=33;
	Punkt_c.index=3;
//--------------------------------------------------------------



	for (ptr_Objekt = Objekt.begin();ptr_Objekt != Objekt.end(); ptr_Objekt++)
	{
		vector<MyIndex> dreieck=Dreieck(Punkt_a,Punkt_b,Punkt_c,Dreieck_ );
		Objekt.push_back(dreieck);	
	}

 return 0;
}
static vector<MyIndex> Dreieck (MyIndex& Punkt_a,MyIndex& Punkt_b,MyIndex& Punkt_c,vector<MyIndex> Dreieck_)
{
Dreieck_.push_back(Punkt_a);
Dreieck_.push_back(Punkt_b);
Dreieck_.push_back(Punkt_c);
return(Dreieck_);
}*

Gibt es denn noch eine andere Variante ohne UP? 
Gruss


----------



## vfl_freak (6. Februar 2009)

Moin,

ob dass alles so funktioniert, wage ich so aus dem Stand nicht zu beurteilen ... 

Aber wer oder was ist bitte _*"UP"*_ ? ? ?  

Gruß
Klaus


----------



## no82 (6. Februar 2009)

UP := Unterprogramm:suspekt:


----------



## vfl_freak (6. Februar 2009)

Unterprogramm ? ? ?  Was genau meinst Du denn damit? ? ? 

Du hast eine Klasse "MyIndex", einen Vektor "MyIndex" und eine main-Funktion ..... welches Unterprogramm ? ? ? :suspekt:

Gruß
Klaus


----------



## no82 (6. Februar 2009)

Also das hier ist das Unterprogramm:
static vector<MyIndex> Dreieck (MyIndex& Punkt_a,MyIndex& Punkt_b,MyIndex& Punkt_c,vector<MyIndex> Dreieck_)
{
Dreieck_.push_back(Punkt_a);
Dreieck_.push_back(Punkt_b);
Dreieck_.push_back(Punkt_c);
return(Dreieck_);
}


----------



## vfl_freak (6. Februar 2009)

Meinst Du sowas ?

```
#include<iostream>
#include<vector>
using namespace std;


class MyIndex
{
public:
    double X;
    double Y;
    int index;
};

static vector<MyIndex> Dreieck(MyIndex&,MyIndex&,MyIndex&,vector<MyIndex>);

int main ()
{
    MyIndex Punkt_a,Punkt_b,Punkt_c ;
    vector<vector<MyIndex> > Objekt;
    vector<MyIndex> Dreieck_;
    vector<MyIndex>::iterator ptr_Punkte;
    vector<vector<MyIndex> >::iterator ptr_Objekt;
//-------------------------------------------------------------
    Punkt_a.X=10;
    Punkt_a.Y=13;
    Punkt_a.index=1;
    Punkt_b.X=20;
    Punkt_b.Y=23;
    Punkt_b.index=2;
    Punkt_c.X=30;
    Punkt_c.Y=33;
    Punkt_c.index=3;
//--------------------------------------------------------------

    for (ptr_Objekt = Objekt.begin();ptr_Objekt != Objekt.end(); ptr_Objekt++)
    {
        Dreieck_.push_back(Punkt_a);
        Dreieck_.push_back(Punkt_b);
        Dreieck_.push_back(Punkt_c);

        Objekt.push_back(Dreieck_);
    }

    return 0;
}
```

Ist aber ohne Gewähr - hab's nicht ausprobiert ...

Gruß
Klaus


----------



## no82 (6. Februar 2009)

Sieht ja eigentlich sehr logisch aus,werd mich mal ans implementieren machen. Vielen Dank fuer deine Hilfe.
Gruss


----------



## no82 (17. Februar 2009)

Hallo,
hab mal wieder ein Problem mit einem vector.
Also mit push_back() kann ich ja an einen bestehenden vector hinten was anhaengen.Wie kann ich denn bei einem vector vorne was einfuegen und gleichzeitig den alten Wert entfernen?
Vielen Dank


----------



## vfl_freak (17. Februar 2009)

Moin,

also:
"push_back()" hängt am Ende ein Element an
"pop_back()" entfernt das letzte Element

Es gibt zwar die Funktionen "push_front()" und "pop_front()", aber meines Wissens nicht für Vektoren, sondern nur für _*lists*_ und _*deques*_
Ich denke, Du wirst wohl oder übel den Inhalt des Vektor ohne das erste Element in einen zweiten umkopieren müssen oder benutzt statt dessen eine *deque* (doppelt verkette Liste)!

Hierzu noch schnell ein passender Link:
http://www.cppreference.com/wiki/stl/deque/start

Gruß
Klaus


----------



## deepthroat (17. Februar 2009)

Hi.





no82 hat gesagt.:


> Hallo,
> hab mal wieder ein Problem mit einem vector.
> Also mit push_back() kann ich ja an einen bestehenden vector hinten was anhaengen.Wie kann ich denn bei einem vector vorne was einfuegen und gleichzeitig den alten Wert entfernen?


Das ist eine etwas seltsame Beschreibung für das was du machen willst. Ich würde einfach sagen: du möchtest den aktuellen Wert überschreiben. Und das ist ziemlich einfach:

```
vector<my_type> v(10);

v[0] = neuer_wert;
```

Ansonsten kannst du mit der insert Methode etwas an einer beliebigen Stelle einfügen. Sei dir aber im Klaren darüber, das es bei einem Vektor im allgemeinen keine gute Idee ist.

Gruß


----------

