gpt4 book ai didi

c++ - 语义 Action 后丢弃解析结果

转载 作者:太空宇宙 更新时间:2023-11-04 12:37:18 27 4
gpt4 key购买 nike

在 Boost.Spirit 中,只需通过以下操作即可从流读取到 std::vector:

#include<vector>
#include<boost/spirit/include/qi.hpp>
namespace sqi = boost::spirit::qi;
int main(){
std::string const v_str = "AA BB CC";
std::vector<std::string> v;
auto it = begin(v_str);
bool r = sqi::phrase_parse(it, end(v_str),
(*sqi::lexeme[+sqi::char_("A-Z")]), sqi::space, v);
assert( v.size() == 3 and v[2] == "CC" );
}

不过碰巧因为输入格式的缘故,我提前知道了元素个数,应该可以预留vector中的空间。例如输入字符串为“3 AA BB CC”,可以预先分配三个元素。

问题是如何将这些额外信息传递给 vector 并优化后面的 push_back(例如避免重新分配)。

我尝试的是在开始时解析一个整数,然后在执行 reserve 时将语义操作关联到它。

        std::string const v_str = "3 AA BB CC";
std::vector<std::string> v;
auto it = begin(v_str);
bool r = sqi::phrase_parse(it, end(v_str),
sqi::int_[([&](int i){v.reserve(i);})] >>
(*sqi::lexeme[+sqi::char_("A-Z")]), sqi::space, v);

问题是在语义操作之后整数没有被忽略,从我的测试中我可以看到它试图在保留之后将结果(示例中的 3)插入 vector .

另一种解决方法是向 phrase_parse 函数添加另一个参数,但这似乎有点矫枉过正。

那么,我怎样才能解析 Boost.Spirit 中的某些内容并只执行语义操作而不将结果发送到接收器变量?

即使可以做到这一点,我也不确定这是否是正确的做法。

最佳答案

您可以创建假 vector ,它只会在插入和解析相同文本两次时计算在内:

#include<vector>
#include<boost/spirit/include/qi.hpp>
namespace sqi = boost::spirit::qi;
struct fake_vector
{
typedef std::string value_type;
fake_vector() : counter(0) {}
std::size_t end() const {return 0;};
void insert(std::size_t, std::string){ ++counter; }

std::size_t counter;
};
int main(){
std::string const v_str = "AA BB CC";
auto it = begin(v_str);
fake_vector fv;
bool r = sqi::phrase_parse(it, end(v_str), (*sqi::lexeme[+sqi::char_("A-Z")]), sqi::space, fv);
assert(fv.counter == 3);
std::vector<std::string> v;
v.reserve(fv.counter);
it = begin(v_str);
r = sqi::phrase_parse(it, end(v_str), (*sqi::lexeme[+sqi::char_("A-Z")]), sqi::space, v);
assert( v.size() == 3 and v[2] == "CC" );
}

关于c++ - 语义 Action 后丢弃解析结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55858425/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com