qi::parse boost change begin 迭代器
qi::parse boost change begin iterator
下面的函数是否更改先指向 s.begin()
后指向 s.begin() + 1
的迭代器?我说的对吗?
#include <boost/spirit/include/qi.hpp>
#include <string>
#include <iostream>
using namespace boost::spirit;
int main()
{
std::string s;
std::getline(std::cin, s);
auto it = s.begin();
bool match = qi::parse(it, s.end(), ascii::digit);
std::cout << std::boolalpha << match << '\n';
if (it != s.end())
std::cout << std::string{ it, s.end() } << '\n';
}
输入:
1Kar
输出:
Kar
是的,如果解析器(下面的 expr
参数)成功,那么您是对的。这就是输入 1Kar
发生的情况。您正在使用以下内容:
//boost/spirit/home/qi/parse.hpp
template <typename Iterator, typename Expr>
inline bool
parse(Iterator& first, Iterator last, Expr const& expr);
第一个迭代器由左值引用传递,在成功解析后,它被重新定位到解析器使用的最右边的位置。如果 none 个解析组件失败,则移动迭代器,例如:
//Input: 1Kar
qi::parse(it, s.end(), ascii::digit >> ascii::digit); //Fail
assert(it == s.begin());
//Input: 1Kar
qi::parse(it, s.end(), ascii::digit); //Ok
assert(it == std::next(s.begin()));
下面的函数是否更改先指向 s.begin()
后指向 s.begin() + 1
的迭代器?我说的对吗?
#include <boost/spirit/include/qi.hpp>
#include <string>
#include <iostream>
using namespace boost::spirit;
int main()
{
std::string s;
std::getline(std::cin, s);
auto it = s.begin();
bool match = qi::parse(it, s.end(), ascii::digit);
std::cout << std::boolalpha << match << '\n';
if (it != s.end())
std::cout << std::string{ it, s.end() } << '\n';
}
输入:
1Kar
输出:
Kar
是的,如果解析器(下面的 expr
参数)成功,那么您是对的。这就是输入 1Kar
发生的情况。您正在使用以下内容:
//boost/spirit/home/qi/parse.hpp
template <typename Iterator, typename Expr>
inline bool
parse(Iterator& first, Iterator last, Expr const& expr);
第一个迭代器由左值引用传递,在成功解析后,它被重新定位到解析器使用的最右边的位置。如果 none 个解析组件失败,则移动迭代器,例如:
//Input: 1Kar
qi::parse(it, s.end(), ascii::digit >> ascii::digit); //Fail
assert(it == s.begin());
//Input: 1Kar
qi::parse(it, s.end(), ascii::digit); //Ok
assert(it == std::next(s.begin()));