Wie kann ich Doppelpaare von einem std :: string mit Boost-Geist extrahieren?
-
01-10-2019 - |
Frage
Ich möchte eine Zeichenfolge mit einer Folge von Doppelpaare in ein std :: map analysieren mit Boost-Geist.
angepasst ich das Beispiel von http://svn.boost.org/ svn / boost / trunk / libs / Geist / example / Qi / key_value_sequence.cpp aber ich habe ein Problem mit difining eine richtige Qi :: Regel für Schlüssel und Wert:
template <typename Iterator>
struct keys_and_values : qi::grammar<Iterator, std::map<double, double> >
{
keys_and_values()
: keys_and_values::base_type(query)
{
query = pair >> *(qi::lit(',') >> pair);
pair = key >> value;
key = qi::double_;
value = +qi::double_;
}
qi::rule<Iterator, std::map<double, double>()> query;
qi::rule<Iterator, std::pair<double, double>()> pair;
qi::rule<Iterator, std::string()> key, value;
};
Ich kann nicht doppelt () verwenden, für die die Schlüssel und Wert Regeln und ein std :: string kann nicht von einem Doppel aufgebaut werden.
Lösung
Ich bin nicht sicher, warum Sie nicht doppelt verwenden können () Schlüssel und Wert, wenn der Leistungsbedarf
map<double, double>.
Wie ich das Problem der Code unten verstehen sollte es lösen.
template <typename Iterator>
struct keys_and_values : qi::grammar<Iterator, std::map<double, double>() >
{
keys_and_values()
: keys_and_values::base_type(query)
{
query = pair >> *(qi::lit(',') >> pair);
pair = key >> -(',' >> value); // a pair is also separated by comma i guess
key = qi::double_;
value = qi::double_; // note the '+' is not required here
}
qi::rule<Iterator, std::map<double, double>()> query;
qi::rule<Iterator, std::pair<double, double>()> pair;
qi::rule<Iterator, double()> key, value; // 'string()' changed to 'double()'
};
Der obige Code parst die Eingabe von Doppelsequenz 1323.323,32323.232,3232.23,32222.23 in
Karte [1323.323] = 32323.232
Karte [3232,23] = 32.222,23