c++ - 将 std::stringstream 数据高效解析为 std::vector<std::vector<double>>

标签 c++ boost stl

我正在将 double 值对的数据流解析为 std::vector>。我使用 boost,因为我认为它更有效率。我的代码如下。

                std::stringstream tmp_stream;                
                typedef double data_type;            
                typedef ::std::vector < data_type > V_d;
                // type below describes type of the container of all data
                typedef ::std::vector < V_d > V_v_d;
                // list container 
                //typedef ::std::list < V_d > V_v_d;

                V_v_d data;

                ::data_parser::Data_parser < V_v_d > data_parser;
                data_parser ( tmp_stream, data );

我的输入文本文件格式为 { (132.181,0.683431), (136.886,0.988517), (137.316,0.504297), (133.653,0.602269), (150.86,0.236839) } 这些对没有被正确解析,我收到了空对。可能是什么问题呢? 谢谢

最佳答案

使用一点 Boost Spirit,您可以使用一行:

if (tmp_stream >> std::noskipws >> 
       qi::phrase_match((+qi::double_) % qi::eol, qi::blank, data))
{

和另一行显示结果作为奖励:

    std::cout << karma::format((karma::double_ % ", ") % karma::eol, data) << "\n";
}

注意 它处理inf, -inf, nan :)

查看 Live on Coliru :

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/qi_match.hpp>

namespace qi = boost::spirit::qi;
namespace karma = boost::spirit::karma;

int main()
{
    std::vector<std::vector<double>> data;

    std::stringstream tmp_stream(
            "123 45 inf -inf nan .7e-99\n"
            "42\n"
            "-1");

    if (tmp_stream >> std::noskipws >> qi::phrase_match((+qi::double_) % qi::eol, qi::blank, data))
    {
        std::cout << karma::format((karma::double_ % ", ") % karma::eol, data) << "\n";
    }
}

更新 稍微适应您的输入语法,我建议改为解析成对 vector :

#include <boost/fusion/adapted/std_pair.hpp> // handle std::pair
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/qi_match.hpp>

namespace qi = boost::spirit::qi;
namespace karma = boost::spirit::karma;

int main()
{
    std::vector<std::pair<double, double>> data;

    std::stringstream tmp_stream("{ (132.181,0.683431), (136.886,0.988517), (137.316,0.504297), (133.653,0.602269), (150.86,0.236839) }");

    if (tmp_stream >> std::noskipws >> qi::phrase_match(
                   '{' 
                >> 
                     ( '(' >> qi::double_ >> "," >> qi::double_ >> ')' )
                     % ','
                >> '}',
                qi::space, data))
    {
        std::cout << karma::format(karma::delimit(" ") [karma::auto_] % karma::eol, data) << "\n";
    }
}

打印:(参见 Live On Coliru

132.181 0.683 
136.886 0.989 
137.316 0.504 
133.653 0.602 
150.86 0.237 

注意 为了加快速度,考虑不从流中解析,而是使用

  • streambuf_iterator
  • 底层字节数据,如果你有它在内存中的话

关于c++ - 将 std::stringstream 数据高效解析为 std::vector<std::vector<double>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21824833/

相关文章:

ruby - 为什么我不能让 swig wrap std::vector 到 Ruby 类?

C++ STL 映射 : insert is storing null pointers

C++,某些组合永远不会出现使用 rand()

c++ - e1071 中的自定义内核

c++ - 关于 boost::iter_split 文档

c++ - boost::async_read 中的 EOF 与 thread_pull 和 boost 1.54

c++ - 有条件地将一个 vector 复制到另一个 vector 的最快方法

android - 如何通过 Eclipse 在 android 项目中创建 C++ 类?

c++ - 使用来自另一个项目(目录)的头文件

c++ - boost asio检测/避免接收缓冲区溢出