Michael S. schrieb:
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
oben einfügen.
Auch kann man in meinem Beispiel ein wenig abkürzen:
1 |
std::vector<int> numbers(std::istream_iterator<int>{ss}, {});
|
Der Compiler kommt hier von selbst darauf, dass {} der passende End-Iterator sein soll (etwas vereinfacht ausgedrückt).
https://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Die_STL/_Iteratoren
https://www.kompf.de/cplus/artikel/stream4.html
https://cplusplus.com/reference/sstream/stringstream/