2016-04-24 10 views
-2

Gibt es eine einfache Möglichkeit, eine durch Leerzeichen getrennte Zeichenkette in einen Vektor von Ints zu konvertieren, oder etwas, das ich einfach in einen Vektor umwandeln kann?Konvertieren einer Zeichenkette von Zahlen in einen Int-Vektor C++

Ich erstelle einen Eingabeoperator (>>), um einen binären Baum zu erstellen, der Werte verwendet, die von der Befehlszeile eingegeben werden. Und das ist die Haupt, die mit ihm

int main(int argc, char **argv) 
{ 
stringstream stream; 
stream << " 10" << " 11" << " 10" << " 2" << endl; 
tree = new binary_tree(); 
stream >> *tree; 
if (tree->inorder() != string("7 10 11")) //inorder() prints the tree in order 
cout << "Test passed" << endl; 
delete tree; 

return 0; 
} 

Das Problem, das ich habe ist, dass geht, während ich erstellen und die Werte gedruckt, die ich brauche, ich kann sie nicht konvertieren und sie in einen Vektor setzen - für die Ich habe eine funktionierende definierte Methode, die einen Baum aus den Werten erstellt.

std::istream& operator>>(std::istream &in, binary_tree &value) 
{ 
vector<int> input_tree; 
string readline;  
getline(in, readline); 
cout << "(" << readline << ")" << endl; //prints correctly - (10 11 10 2) 

    //where I need to insert insert values into vector 

for(int i = 0; i < input_tree.size(); i++) 
{ 
    insert(input_tree[i], value); //inserts the values from a vector into a binary tree 
} 

return in; 
} 

ich versucht habe, durch den Strang Looping und mit stoi() auf jedes Zeichen, aber es ist immer fehlerbehaftete, wenn die Räume Fehler verursacht wurden.

Vielen Dank für jede Hilfe und Entschuldigung, wenn ich irgendwelche wichtigen Informationen verpasst habe.

+0

Sie müssen genau zeigen, wie Sie die Eingabe zu konvertieren versucht, anstatt sie zu verlassen und diesen Code zu ersetzen mit dem „// wo ich brauche Einsatz Werte in dem Vektor einzufügen“ Kommentar. stackoverflow.com ist kein Code-Schreibdienst. Niemand wird Ihren Code für Sie schreiben. Aber, wenn Sie versucht haben, die Eingabe in Ihren 'int'-Vektor zu parsen, und es funktioniert nicht richtig, und Sie wissen nicht, was falsch ist, dann wäre dies eine gültige Frage. Aber "bitte schreibe den Code für mich" ist keine gültige Frage. –

+0

Die Frage ist, ob es eine Möglichkeit gibt, eine Zeichenfolge in einen Vektor Typ zu konvertieren, ich fordere niemanden auf, meinen Code zu schreiben Ich frage nach einer ganz bestimmten Sache, während ich meinen Code als Referenz zeige. – KL123

+0

Nun, wenn das deine Frage ist, dann lautet die Antwort "ja, es gibt einen Weg". –

Antwort

1

Sie können dies tun:

vector<int> vec((istream_iterator<int>(in)), istream_iterator<int>()); 

Diese ganzen Zahlen von in lesen und sie in vec alle in einer Zeile einzufügen. Es ist eine hübsche kanonische Verwendung von istream_iterator, die Teil der Standardbibliothek ist. Dann müssen Sie nicht jede Zeile lesen und selbst analysieren.

Wenn Sie mehr darüber lesen möchten, wie das funktioniert, sehen Sie hier: How does std::copy work with stream iterators

Was, warum es ein zusätzliches Paar von Klammern um das erste Argument zu sein scheinen, ist, dass wegen der „drängendsten Parse“: https://en.wikipedia.org/wiki/Most_vexing_parse - nur eine alberne Eigenart der C++ - Syntax.

+0

Ich habe es nicht getestet, aber das würde sicherlich nicht funktionieren, weil ich in meinem Beispiel einen Stringstream benutze und sie als Zeichen und nicht als int-Typen eingegeben werden? – KL123

+0

@ KL123: Nein, das ist der ganze Punkt. Der 'istream_iterator ' ist eine Schnittstelle zu einem 'istream' (was ein 'stringstream' ist) und führt die formatierte Extraktion nach 'int' aus. Klicken Sie auf den Link in der Antwort mit der Bezeichnung "Wenn Sie mehr darüber lesen möchten, wie das funktioniert ..." –

+0

Dies ist jedoch kaum ein sehr aussagekräftiger oder klarer Code. Wie oben gezeigt.Ich würde es in Produktionscode schreiben, weil es die beste Lösung ist, die C++ zu bieten hat, aber leider sagt das mehr über C++ aus als vieles andere. –

0

ein wenig leichter zu verstehen Lösung, denke ich (wenn auch weniger prägnant):

#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 
using namespace std; 

int main() { 
    string s= "4 5 6"; 
    stringstream ss(s); 
    vector<int> v; 

    int hlp; 
    while(ss >> hlp) 
    { 
     v.push_back(hlp); 
    } 

    for(auto i: v) 
     cout << i << '\n'; 
    return 0; 
} 

Sie einen stringstream verwenden können wie Sie cin nutzen könnten.

http://ideone.com/Y6UfuW

+0

Danke das hat perfekt funktioniert! – KL123

Verwandte Themen