Forum: PC-Programmierung Vector ausgeben


von Humpen (Gast)


Lesenswert?

Hallo. Ich möchte einen Vektor in C++ mittels Operatorüberladung 
ausgeben weis aber nicht genau wie. Wie würdet ihr das machen?
1
vector<int> ages{100};
2
3
ostream& operator<<(ostream& os, vector<int>& v)
4
{
5
return os << v;
6
}

Naja und das geht so nicht.

von M.K. B. (mkbit)


Lesenswert?

Das was du da programmiert hast ist eine Endlosschleife. In dem << 
Operator rufst du wieder diesen Operator auf.

Die Überladung müsste so passen, aber der vector sollte besser als const 
Referenz übergeben werden. In der Funktion musst du dann über die 
Elemente des Vektors iterieren und diese dann auf den Stream schreiben. 
Trennzeichen und Formatierung der Ausgabe kannst du dann auch festlegen.

von Humpen (Gast)


Lesenswert?

Hast du mir ein Codebeispiel?

von Dirk K. (d-k)


Lesenswert?

Falls das Hausaufgaben sind hat dir mkbit den Weg aufgezeigt.

Wenn du einfach nur eine funktionierende Lösung brauchst schau mal hier: 
https://louisdx.github.io/cxx-prettyprint/ Damit funktioniert es 
einfach.

Beispiel von der genannten Seite:
1
#include <iostream>
2
#include <vector>
3
#include "prettyprint.hpp"
4
5
int main() {
6
    std::vector<int> foo;
7
    foo.push_back(1);
8
    foo.push_back(2);
9
    foo.push_back(3);
10
    std::cout << "My vector: " << foo << std::endl;
11
    return 0;
12
}

von humpen (Gast)


Lesenswert?

M.K. B. schrieb:
> In der Funktion musst du dann über die
> Elemente des Vektors iterieren
1
vector<int> ages;
2
ages.push_back(10);
3
ages.push_back(12);
4
ages.push_back(13);
5
ages.push_back(14);
6
ages.push_back(15);
7
8
ostream& operator<<(ostream& os, const vector<int>& ages)
9
{
10
    for(int i=0; i<ages.size(); ++i)
11
        os << ages[i] << endl;
12
    return os;
13
}

Danke, habe es kapiert, man kann quasi endlos in den ostream schreiben, 
das mache ich dann mit der Iteration, zum Schluss gebe ich dann den 
ostream zurück.

von humpen (Gast)


Lesenswert?

Dirk K. schrieb:
> Wenn du einfach nur eine funktionierende Lösung brauchst schau mal hier:
> https://louisdx.github.io/cxx-prettyprint/ Damit funktioniert es
> einfach.

Danke, es ging mir schon darum es zu verstehen. Es waren keine 
Hausaufgaben sondern eine Übungsaufgabe eines Tutorials. Habe es jetzt 
verstanden.

von René H. (Gast)


Lesenswert?

humpen schrieb:
> for(int i=0; i<ages.size(); ++i)
>         os << ages[i] << endl;

Eigentlich nimmt man dafür einen Iterator. Wäre „sauberer“.

Grüsse,
René

von M.K. B. (mkbit)


Lesenswert?

René H. schrieb:
> Eigentlich nimmt man dafür einen Iterator. Wäre „sauberer“.

Oder seit C++11 ein range based for. Iterator geht aber natürlich auch 
in C++11 noch.
1
for(const int i: v) {
2
...
3
}

von A. H. (ah8)


Lesenswert?

M.K. B. schrieb:
> René H. schrieb:
>> Eigentlich nimmt man dafür einen Iterator. Wäre „sauberer“.
>
> Oder seit C++11 ein range based for. Iterator geht aber natürlich auch
> in C++11 noch.


Eigentlich gibt es für so etwas output iteratoren:

1
#include <vector>
2
#include <iterator>
3
#include <algorithm>
4
#include <iostream>
5
6
template < typename T >
7
std::ostream& operator<<(std::ostream& os, std::vector<T> const& v)
8
{
9
  std::copy(v.begin(), v.end(), std::ostream_iterator<T>(os, " "));
10
  return os;
11
}
12
13
int main()
14
{
15
  std::vector<int> ages;
16
  ages.push_back(10);
17
  ages.push_back(12);
18
  ages.push_back(13);
19
  ages.push_back(14);
20
  ages.push_back(15);
21
  std::cout << ages << std::endl;
22
}

: Bearbeitet durch User
von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Hallo,

Humpen schrieb:
> Hallo. Ich möchte einen Vektor in C++ mittels Operatorüberladung
> ausgeben weis aber nicht genau wie. Wie würdet ihr das machen?
> vector<int> ages{100};

nur ganz leise und am Rande bemerkt, bist Du Dir sicher, dass das tut, 
was Du denkst, was es tut? Der Vektor hat danach die Größe 1 und ages[0] 
liefert 100.
Wolltest Du das?

vlg
Timm

von Humpen (Gast)


Lesenswert?

Timm R. schrieb:
> Der Vektor hat danach die Größe 1 und ages[0] liefert 100.
> Wolltest Du das?

Mir ging es nur darum den Vektor per Operatorüberladung auszugeben, dass 
er dabei nur ein Element besitzt ist ok. Habe später den Code abgeändert 
als es - dank den vielen Hilfestellungen - richtig geklappt hat. Danke 
aber für den Hinweis.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.