2013-10-15 12 views
5

Ecco un bel modo per analizzare int e memorizzarli in un vettore, a condizione che siano spazio delimitato (da Split a string in C++?):Parsing interi con STL

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

int main() { 
    using namespace std; 

    string s = "3 2 1"; 
    istringstream iss(s); 
    vector<int> tokens; 

    copy(istream_iterator<int>(iss), 
     istream_iterator<int>(), 
     back_inserter<vector<int> >(tokens)); 
} 

E 'possibile specificare un altro delimitatore (ad esempio", ") mantenendo qualcosa di simile?

+1

@itwasntpete: No, non è un duplicato. OP chiede specificamente se questo è possibile * utilizzando un metodo particolare *. – bitmask

+0

mi dispiace incompreso la domanda :) – user1810087

risposta

1

Si può generalizzare la scissione stringa utilizzando un'espressione regolare (C++ 11). Questa funzione converte la tua stringa dividendola in un'espressione regolare.

vector<string> split(const string& input, const regex& regex) { 
    sregex_token_iterator 
     first(input.begin(), input.end(), regex, -1), 
     last; 
    return vector<string>(first, last); 
} 

Per esempio, per dividere su '' passano regex(",") nella funzione.

#include <iostream> 
#include <string> 
#include <regex> 
#include <vector> 

using namespace std; 

vector<string> split(const string& input, const regex& regex) { 
    sregex_token_iterator 
     first(input.begin(), input.end(), regex, -1), 
     last; 
    return vector<string>(first, last); 
} 

int main() { 

    const regex r = regex(","); 
    const string s = "1,2,3"; 

    vector<string> t = split(s, r); 
    for (size_t i = 0; i < t.size(); ++i) { 

     cout << "[" << t[i] << "] "; 
    } 
    cout << endl; 

    return 0; 
}