2016-11-01 1 views
0

Ich habe die folgende Zeichenfolge:Split eine Reihe von positiven/negativen ganzen Zahlen von Raum

1 -2 -8 4 51 

Ich mag einen Vektor mit 5 Elementen bekommen, jeder von ihnen auf die 5 Zahlen in der Zeichenfolge entspricht. Grundsätzlich möchte ich die obige Zeichenfolge als Trennzeichen nach Leerzeichen aufteilen.

Ich habe eine Menge Fragen wie diese auf Stack Overflow gefunden, aber bisher kann keiner von ihnen die erste "1" oder die letzte (von 51) bekommen. Mein Code ist folgende:

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 
#include <sstream> 

using namespace std; 

std::vector<std::string> split(std::string str) 
{ 
    std::string buf; 
    std::stringstream ss(str); 
    vector<std::string> tokens; 

    while (ss >> buf) 
     tokens.push_back(buf); 
    return tokens; 
} 

int main() 
{ 

    std::string temps = "1 -2 -8 4 51"; 

    std::vector<std::string> x = split(temps); 
    for (int j = 0; j < x.size(); j++){ 
     cout << x[j] << endl;  
    } 
} 

Meine Ausgabe ist die folgende:

-2 
-8 
4 
5 

Wie Sie das erste und das letzte 1 sehen können, werden übersprungen. Ich bin sehr neu in C++ (ich war vielleicht zu sehr an die integrierten Funktionen .split() anderer Sprachen gewöhnt), aber ich kann nichts falsches auf meinem obigen Code sehen. Kann mir bitte jemand helfen, zu verstehen, was ich falsch mache?

+5

err funktioniert gut hier. Ich erhalte '1 -2 -8 51' wie erwartet ... –

+6

[Nicht reproduzierbar] (http://coliru.stacked-crooked.com/a/cffe001aedf4e0ee) – NathanOliver

+0

Was ist Ihr Compiler? Funktioniert gut auf gcc: http://melpon.org/wandbox/permlink/RZOT5kbvHvPraz5b – krzaq

Antwort

1

Der von Ihnen angezeigte Code funktioniert im Allgemeinen gut. Die Ausgabe ist wie erwartet, daher muss das Problem außerhalb des von Ihnen angezeigten Codes liegen.

Beachten Sie jedoch, dass Ihre vectorstd::string Werte enthält, nicht int Werte. Außerdem sollten Sie die Verwendung von std::istringstream für die Eingabe anstelle von std::stringstream in Erwägung ziehen.

Wenn Sie einen Vektor von ganzen Zahlen wollen, versuchen Sie stattdessen:

#include <iostream> 
#include <vector> 
#include <string> 
#include <sstream> 

std::vector<int> split(const std::string &str) 
{ 
    int num; 
    std::istringstream iss(str); 
    std::vector<int> tokens; 

    while (iss >> num) 
     tokens.push_back(num); 

    return tokens; 
} 

int main() 
{ 
    std::string temps = "1 -2 -8 4 51"; 

    std::vector<int> x = split(temps); 
    for (int j = 0; j < x.size(); j++) { 
     std::cout << x[j] << std::endl; 
    } 

    return 0; 
} 

Sie dann split() Verwendung std::istream_iterator und std::back_inserter statt einer manuellen Schleife machen könnten, zB:

#include <iostream> 
#include <vector> 
#include <string> 
#include <sstream> 
#include <iterator> 
#include <algorithm> 

std::vector<int> split(const std::string &str) 
{ 
    std::istringstream iss(str); 
    std::vector<int> tokens; 

    std::copy(
     std::istream_iterator<int>(iss), 
     std::istream_iterator<int>(), 
     std::back_inserter(tokens) 
    ); 

    return tokens; 
} 

int main() 
{ 
    std::string temps = "1 -2 -8 4 51"; 

    std::vector<int> x = split(temps); 
    for (int j = 0; j < x.size(); j++) { 
     std::cout << x[j] << std::endl; 
    } 

    return 0; 
} 

Und Sie dann könnte `split() eine Template-Funktion sein, so dass es einen Vektor verschiedener Typen zurückgeben kann, abhängig davon, was Sie von der Eingabe-Zeichenkette wollen, zB:

#include <iostream> 
#include <vector> 
#include <string> 
#include <sstream> 
#include <iterator> 
#include <algorithm> 

template<typename T> 
std::vector<T> split(const std::string &str) 
{ 
    std::istringstream iss(str); 
    std::vector<T> tokens; 

    std::copy(
     std::istream_iterator<T>(iss), 
     std::istream_iterator<T>(), 
     std::back_inserter(tokens) 
    ); 

    return tokens; 
} 

int main() 
{ 
    std::string temps = "1 -2 -8 4 51"; 

    std::vector<int> x = split<int>(temps); 
    for (int j = 0; j < x.size(); j++) { 
     std::cout << x[j] << std::endl; 
    } 

    return 0; 
} 
Verwandte Themen