Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LsFan

Frischling

  • »LsFan« ist der Autor dieses Themas

Beiträge: 29

Beruf: Der Böse Admin sein xD

  • Private Nachricht senden

1

10.06.2013, 15:44

C++ string vector ... HILFE???

Moinsen,

ich hab ein kleines Projekt, bei dem ich gerne alle Inhalte eines Stringvectors ausgeben würde... Also nicht:



C-/C++-Quelltext

1
cout << stringVector.size();




sondern alle Wörter/Sätze , die ich mit push_back hinzufüge!



Also wie???



lg LsFan :D
(\ /) | Dies ist Hase.
(^.^) | <-- Bitte kopiere Hase in deine Signatur
(*_*) | und hilf ihm, die Weltherrschaft an sich zu reißen.

wluc-16

Treue Seele

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

2

10.06.2013, 15:48

Du kannst den []-Operator verwenden. Dieser wurde überladen, und zwar so, dass du den Vektor wie ein Array verwenden kannst.

Also:

C-/C++-Quelltext

1
2
for(int i = 0; i < stringVector.size(); i++)
    cout << stringVector[i] << endl;

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

10.06.2013, 15:57

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
#include <string>

void DoStuff()
{
    // std::vector auf std::string erstellen und mit Inhalt füllen.
    std::vector<std::string> stringVector;
    stringVector.push_back("qwertz");
    stringVector.push_back("asdfgh");
    stringVector.push_back("yxcvbn");
    stringVector.push_back("123456");

    // über die einzelnen Items aus dem std::vector iterieren. Statt auto kann natürlich auch der Typ selbst verwendet werden. So spart man sich aber Schreibarbeit.
    for(auto item : stringVector)
    {
        // einfache Ausgabe der einzelnen Elemente mit abschließendem Zeilenumbruch.
        std::cout << item << std::endl;
    }
}


edit: Siehe Schrompfs Beitrag. Bei mir werden Kopien erzeugt, das ist richtig. Seine Variante ist da noch ein wenig hübscher.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Schorsch« (10.06.2013, 16:02)


patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

4

10.06.2013, 15:57

Oder mit einem Iterator

C-/C++-Quelltext

1
2
for(std::vector<std::string>::iterator it = stringVector.begin(); it < stringVector.end(); it++)
    std::cout << *it << std::endl;

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

5

10.06.2013, 15:59

Ich würde ein size_t anstatt int für die Schleifenvariable nehmen, damit der Compiler nicht wegen Vorzeichen warnt. Abgesehen davon hat wluc den Finger drauf.

Mit dem neuen C++11 gibt es übrigens eine freundlichere Schreibweise dafür. Lies den Code als "Für jeden String s in stringvector"

Quellcode

1
2
for( const string& s : stringVector )
  cout << s << endl;


[edit] Hui, das geht ab hier. Schorsch schlägt genauso wie ich eine for-each-Schleife vor, aber bei seinem Code ist zu beachten, dass der Compiler von jedem String eine Kopie anlegt, was ein bisschen Rechenzeit kostet und evtl. dafür sorgt, dass Änderungen an den Strings nicht auf die Objekte im String-Vektor angewendet werden.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

6

10.06.2013, 16:33

Oder mit einem Iterator

C-/C++-Quelltext

1
2
for(std::vector<std::string>::iterator it = stringVector.begin(); it < stringVector.end(); it++)
    std::cout << *it << std::endl;


Auch das geht neuerdings einfacher mit auto:

C-/C++-Quelltext

1
2
for(auto it = stringVector.begin(); it < stringVector.end(); it++)
    std::cout << *it << std::endl;

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

7

10.06.2013, 16:52

Dazu eine Warnung: der Vergleich mit < ist zweifelhaft. Der klappt wenn überhaupt dann nur mit std::vector::iterator. Unbedingt mit != vergleichen.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

8

10.06.2013, 16:57

Was passiert bei !=, wenn Elemente aus dem vector gelöscht werden?

Normalerweise sollte es mit std::array, vector, deque, forward_list und list klappen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

10.06.2013, 16:59

Elemente innerhalb der Iteration zu löschen führt ohnehin zu einer Exception. Oder meintest Du etwas anderes, patrick246?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

10

10.06.2013, 17:13

Hab ne Stelle gefunden, in der ich Elemente innerhalb der Schleife lösche ( vec.erase(it); ), dort verwende ich aber != als Bedingung.

Ich glaube ich hab da was verwechselt, bei dieser Stelle habe ich mithilfe des []-Operators iteriert, da ich den Index des Elements zur Positionsberechnung gebraucht habe. Wenn ich ein Element gelöscht habe hat std::vecor::size() weniger zurückgeliefert als dann in i stand, dadurch gabs ne Endlosschleife, da i > std::vector::size() war.

Werbeanzeige