Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 解析字符串以创建元素列表_C++_String_String Parsing - Fatal编程技术网

C++ 解析字符串以创建元素列表

C++ 解析字符串以创建元素列表,c++,string,string-parsing,C++,String,String Parsing,我有这样一个字符串: “\r color=\“red\”name=\“Jon\”\t\n depth=\“8.26” 我想解析这个字符串并创建这个对象的std::list: class data { std::string name; std::string value; }; 其中,例如: name = color value = red 最快的方法是什么?我可以用boost 编辑: 这就是我尝试过的: vector<string> tokens; split(

我有这样一个字符串:

“\r color=\“red\”name=\“Jon\”\t\n depth=\“8.26”

我想解析这个字符串并创建这个对象的
std::list

class data
{
    std::string name;
    std::string value;
};
其中,例如:

name = color
value = red
最快的方法是什么?我可以用boost

编辑: 这就是我尝试过的:

vector<string> tokens;
split(tokens, str, is_any_of(" \t\f\v\n\r"));

if(tokens.size() > 1)
{
    list<data> attr;
    for_each(tokens.begin(), tokens.end(), [&attr](const string& token)
        {
            if(token.empty() || !contains(token, "="))
                return;

            vector<string> tokens;
            split(tokens, token, is_any_of("="));
            erase_all(tokens[1], "\"");
            attr.push_back(data(tokens[0], tokens[1]));
        }
    );
}
向量标记;
分割(标记str是(“\t\f\v\n\r”)的任意一个);
if(tokens.size()>1)
{
列表属性;
对于每个(tokens.begin()、tokens.end()、[&attr](常量字符串和标记)
{
if(token.empty()| |!包含(token,“=”))
返回;
向量标记;
分割(令牌,令牌,是(“=”)的任意一个);
擦除所有(标记[1],“\”);
属性推回(数据(令牌[0],令牌[1]);
}
);
}

但是,如果编辑后
:如
color=“red 1”
中有空格,则该选项无效: 对于空间问题,可以执行以下操作:

(将不在“”引号内的所有空格替换为\n)


假设
名称
前至少有一个空格,我认为以下算法足够快:

list<data> l;
size_t fn, fv, lv = 0;

while((fv = str.find("\"", ++lv)) != string::npos &&
    (lv = str.find("\"", fv+1)) != string::npos)
{
    fn = str.find_last_of(" \t\n\v\f\r", fv);
    l.push_back(data(str.substr(++fn, fv-fn-2), str.substr(++fv, lv-fv)));
}

正如你所见,没有必要使用boost或regex,只是标准库。

写得最快,编译得最快,或者运行时最快?获得自我意识最快?我不想为
家庭作业
答案编写实际的代码,但如果是我,我会使用or.Qi。简单地说,这需要工作。你试过什么您可以使用boost,也可以使用boost.Tokenizer。不过,您可能需要对输入字符串进行预处理以清除转义序列。@尼克:回答这个问题就是为您编写实际的代码。.-]Pendantic,但从C++11开始,regex是标准库的一部分。:-]
PrepareForTokanization(str);
split(tokens, str, is_any_of("\t\f\v\n\r"));
list<data> l;
size_t fn, fv, lv = 0;

while((fv = str.find("\"", ++lv)) != string::npos &&
    (lv = str.find("\"", fv+1)) != string::npos)
{
    fn = str.find_last_of(" \t\n\v\f\r", fv);
    l.push_back(data(str.substr(++fn, fv-fn-2), str.substr(++fv, lv-fv)));
}
data(string name, string value)
    : name(name), value(value)
{   }