gilou Modérateur Modzilla | Mais pourquoi faire du C déguisé sous des habits C++ alors que les librairies standard C++ font déjà cela gratuitement?
Si on veut un (ou plusieurs) délimiteurs qui scindent une chaîne en tokens, ça se fait au niveau des character facets.
Et les containers standard sont la pour qu'on les utilise.
Code :
- #include <iostream>
- #include <sstream>
- #include <string>
- #include <vector>
- #include <iterator>
- #include <locale>
- using namespace std;
- struct delim : ctype<char> {
- delim(char c) : ctype<char>(get_table(c)) {}
- static mask const* get_table(char c)
- {
- static mask rc[table_size];
- rc[c] = ctype_base::space;
- rc['\n'] = ctype_base::space;
- return &rc[0];
- }
- };
- int main ()
- {
- istringstream iss("hello#world!#etc and etc..." );
- // changement de facette pour délimiter
- iss.imbue(locale(iss.getloc(), new delim('#')));
- // split en tokens
- vector<string> tokens;
- copy(istream_iterator<string>(iss),
- istream_iterator<string>(),
- back_inserter<vector<string> >(tokens));
- // imprimons le contenu du vector
- copy(tokens.begin(), tokens.end(), ostream_iterator<string>(cout, "\n" ));
- return 0;
- }
|
donne en sortie:
hello
world!
etc and etc...
|
et en ajoutant
rc[' '] = ctype_base::space;
dans get_table
on a en sortie
hello
world!
etc
and
etc... |
Et si de plus on veut profiter des facilités du C++ moderne (ie C++ 11) pour avoir plus de flexibilité dans la construction de la facette, avec une liste de caractères:
Code :
- #include <iostream>
- #include <sstream>
- #include <string>
- #include <vector>
- #include <list>
- #include <iterator>
- #include <locale>
- using namespace std;
- struct delimitation_facet : ctype<char> {
- delimitation_facet(list<char> delims) : ctype<char>(get_table(delims)) {}
- static mask const* get_table(list<char> delims)
- {
- static mask rc[table_size];
- for (char &c : delims)
- rc[c] = ctype_base::space;
- return &rc[0];
- }
- };
- int main ()
- {
- istringstream iss("hello#world!#etc and etc..." );
- iss.imbue(locale(iss.getloc(), new delimitation_facet(list<char>{{ '#', ' ', '\n'}})));
- vector<string> tokens{istream_iterator<string>{iss}, istream_iterator<string>{}};
- copy(tokens.begin(), tokens.end(), ostream_iterator<string>(cout, "\n" ));
- return 0;
- }
|
A+, Message édité par gilou le 25-02-2014 à 14:34:57 ---------------
There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! --
|