2010-10-15 5 views
2

J'entends que l'esprit est vraiment rapide à convertir la chaîne en int.Chaîne à int utilisant l'esprit de boost

Je suis cependant incapable de créer une fonction simple qui peut le faire. Quelque chose comme

int STRING_TO_INT (string & s) { /* ????? * /}

Quelqu'un peut-il utiliser l'esprit de coup de pouce pour remplir cette fonction. En passant, je travaille sur boost 1.34 et non sur la dernière version.

+1

Ce n'est pas "vraiment" rapide, il fonctionne juste à un taux normal. Jamais entendu parler de la parole, dans le pays des aveugles, l'homme un œil est roi? –

Répondre

10

Il existe plusieurs façons d'y parvenir:

#include <boost/spirit/include/qi_parse.hpp> 
#include <boost/spirit/include/qi_numeric.hpp> 

namespace qi = boost::spirit::qi; 

std::string s("123"); 
int result = 0; 
qi::parse(s.begin(), s.end(), qi::int_, result); 

ou une plus courte:

#include <boost/spirit/include/qi_parse.hpp> 
#include <boost/spirit/include/qi_numeric.hpp> 
#include <boost/spirit/include/qi_auto.hpp>  
namespace qi = boost::spirit::qi; 

std::string s("123"); 
int result = 0; 
qi::parse(s.begin(), s.end(), result); 

qui est basé sur auto caractéristiques de l'Esprit. Si vous en enveloppez un dans une fonction, vous obtenez ce que vous voulez.

EDIT: J'ai vu seulement maintenant que vous utilisez Boost 1.34. Donc, voici l'incantation correspondante pour cela:

#include <boost/spirit.hpp> 

using namespace boost::spirit; 

std::string s("123"); 
int result = 0; 
std::string::iterator b = s.begin(); 
parse(b, s.end(), int_p[assign_a(result)]); 
+0

Merci. Je vois dans mon profileur que c'est environ 2.5X plus rapide que atoi. – rahul

+0

Au moins avec Boost 1.58 vous devez modifier inclut pour le compiler. 'parse' à' qi_parse'. Et vous devez également ajouter 'qi_auto' pour la version plus courte à compiler. –

2

int i = boost::lexical_cast<int>(str);

+6

J'ai lu à quelques occasions que boost :: lexical cast est vraiment lent pour de telles conversions triviales. Voir aussi http://stackoverflow.com/questions/1250795/very-poor-boostlexical-cast-performance – Ralf