bin mit dem String durcheinander gekommen. Idee ist, über Konsole werden ganze Zahlen eingetippt, daraus soll eine gerade und ungerade Summe gebildet werden, hier ein Ausschnitt;
1
// *ptrToArray - pointer to the data array
2
// arrayLength - length of the array
3
// vector - contains indices of the array with value of space '32'
Dein tempString hat immer Länge 0, weil du ihn nie vergrößerst bzw. eine Größe an den Konstruktor übergibst. Die Zugriffe tempString[i] sind somit Out-Of-Bounds-Fehler.
Du kannst nicht auf das i'te Zeichen eines leeren Strings zugreifen.
1
tempString.push_back(ptrToArray[y]);
wäre eine gültige Methode. Viele STLs haben eine Möglichkeit, solche Fehler zur Laufzeit zu erkennen. Guck mal, welche Möglichkeiten Dein Compiler hat. Das würde Dir eine Menge Zeit sparen.
Namen, wie ptrToArray haben kaum Informationen, weil nur der Typ im Namen kodiert ist, aber nicht der Zweck / Rolle des Parameters.
danke für eure Inputs, dass mit dem push_back hat jetzt funktioniert.
Ich dachte eigentlich, da ich die einzelnen String Elemente mit string[index] ausgeben kann, dann könnte ich ja auch die Daten genau so rein schreiben.
danke für eure Inputs, dass mit dem push_back hat jetzt funktioniert.
Ich dachte eigentlich, da ich die einzelnen String Elemente mit
string[index] ausgeben kann, dann könnte ich ja auch die Daten genau so
rein schreiben.
eigentlich wollte ich nach dem Fehler suchen, aber da ist ja einiges recht merkwürdig. Irgendwie ein bischen C, ein bischen C++ und viele Ungereimtheiten bzw. Dinge, deren Sinn ich nicht ganz verstehe. Unten ein Vorschlag (einfaches C++17 ohne Schnickschnack und Fehlerprüfung). Die Ausgabe selbst habe ich mal aus der Funktion rausgenommen.
was passiert hier, werden die Zahlen direkt aus dem String im Vector als
int abgelegt ?
der Vector hat einen Konstruktor mit zwei Iteratoren, d.h. der Vektor wird mit den von den Iteratoren gelieferten Werten aufgebaut.
der begin-Iterator ist ein istream-iterator, der integer-Werte aus dem input-stream liest.
der end-Iterator ist der generische "eof"-Iterator dazu.
d.H. der vector wird mit allen aus dem sstream lesbaren integern befüllt.
Wenn man das noch optimieren mag, das Zwischenspeichern im vektor ist eigentlich unnötig, die odd/even-Schleife könnte auch direkt über den istream_iterator<int> laufen.
was passiert hier, werden die Zahlen direkt aus dem String im Vector als
int abgelegt ?
Ja. Es gibt aber noch unzählige andere Methoden, einen solchen String zu splitten/parsen und die Werte in einem Container (wie hier std::vector) abzulegen, von C-Style bis zu STL-Kunststücken und Bibliotheken wie Boost. Die Vorgehensweise mit einem String-Stream ist eben einfach - und man benötigt keine expliziten Schleifen. Dabei werden eigentlich zwei Dinge genutzt: Erstens, dass man mit std::stringstream mit einem String wie mit einem Stream arbeiten kann, zweitens, dass einer der Konstruktoren von std::vector ein Start- und End-Iterator-Paar entgegennimmt (unten "first" und "last", der Allocator ist optional, den kannst du ignorieren).
1
template<class InputIt>
2
vector(InputIt first, InputIt last, const Allocator& alloc = Allocator());
Wenn man das von Hand aufdröselt, ohne den speziellen Konstruktor von std::vector zu benutzen, sieht es in etwa so aus:
1
std::vector<int> numbers;
2
3
std::istream_iterator<int> start_it(ss);
4
std::istream_iterator<int> end_it;
5
6
for(auto it = start_it; it != end_it; ++it)
7
{
8
numbers.emplace_back(*it);
9
}
Den Vektor brauchen wir eigentlich nicht ...
1
for(auto it = start_it; it != end_it; ++it)
2
{
3
if(*it % 2 == 0)
4
evenSum += *it;
5
else
6
oddSum += *it;
7
}
Wenn Du
1
std::istream_iterator<int> start_it(ss);
durch
1
std::istream_iterator<int> start_it(std::cin);
ersetzt, wird statt des String-Streams der Standard-Inputstream verwendet; du kannst dann in der Konsole die Werte eingeben (Beenden der Eingabe mit Ctrl-Z + Enter bzw. Ctrl-D + Enter - oder einfach irgendeinen Buchstaben eingeben + Enter).
Noch eine Möglichkeit, die Werte in einen std::vector zu bekommen, wäre
1
std::copy(std::istream_iterator<int>{ss}, {}, std::back_inserter(numbers)); // zu {} siehe unten
BTW:
Du solltest noch
1
#include <iterator>
oben einfügen.
Auch kann man in meinem Beispiel ein wenig abkürzen:
Ich habe nicht gesehen, dass Εrnst B. schon geantwortet hatte (man sollte vielleicht nicht auf den Antwort-Button klicken und dann erst frühstücken :)).
Eine eigene Frage?
Dieser Thread ist über 3 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.